思路:
按照从大到小的顺序依次把煎饼翻到对应的位置,翻的方法如下,先把对应大小的煎饼翻到最上面,然后再翻下来。
具体代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <sstream>
using namespace std;
vector<int> pancakes;
vector<int> sortedPancakes;
void flip(int n)
{
int p=0,q=n;
while(p<q)
{
swap(pancakes[p],pancakes[q]);
++p;
--q;
}
}
void solve(vector<int>& ans)
{
int pn=pancakes.size();
while(1)
{
int nspos=-1;
for(int i=pn-1;i>=0;--i)
if(pancakes[i]!=sortedPancakes[i])
{
nspos=i;
break;
}
if(nspos==-1)
break;
int numPos;
for(int i=0;i<pn;++i)
if(pancakes[i]==sortedPancakes[nspos])
{
numPos=i;
break;
}
if(numPos!=0)
{
ans.push_back(pn-numPos);
flip(numPos);
}
ans.push_back(pn-nspos);
flip(nspos);
}
}
int main()
{
// freopen("input.txt","r",stdin);
string line;
stringstream ss;
while(getline(cin,line))
{
pancakes.clear();
sortedPancakes.clear();
ss.clear();
ss.str(line);
int t;
while(ss>>t)
{
pancakes.push_back(t);
sortedPancakes.push_back(t);
}
sort(sortedPancakes.begin(),sortedPancakes.end());
vector<int> ans;
solve(ans);
cout<<line<<endl;
for(int i=0;i<ans.size();++i)
cout<<ans[i]<<" ";
cout<<"0"<<endl;
}
return 0;
}