解题思路:这里的排序可以通过按照一定的顺序操作,先将最底下的煎饼归位(找到该点应该放的煎饼处于的位置,先将这个煎饼翻转到最上方,然后再次翻转归位),依次向上,这样不会出现互相干扰的情况。注意代码中要进行一些判别,比如某个煎饼已经是处于正确的位置则不需要再做任何操作,或者某个煎饼已经在最顶上则只需要反转归位即可,这些处理需要引起注意。
题目大意:
输入给定一个序列,相当于是煎饼层层叠起。通过输入操作可以将某一煎饼上所有煎饼反转。
比如下面三个煎饼叠(煎饼8是左边一叠的最上面的一个)
8 7 2
4 6 5
6 4 8
7 8 4
5 5 6
2 2 7
可以通过3,1两次操作从第一个煎饼状态到第三个状态。问经过一系列什么样的操作可以达成从上到小增序的排列。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int s[100];
int a[100];
int n;
void reverse(int k) //将序列为k及以上的煎饼翻转
{
int st=k;
int end=n-1;
while(end>st)
{
swap(s[st++],s[end--]);
}
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
while(cin>>n)
{
for(int i=n-1;i>=0;i--)
{
cin>>s[i];
}
memcpy(a,s,sizeof(s));
sort(a,a+n,cmp);
for(int i=n;i>=1;i--)
{
for(int j=0;j<n;j++)
{
if(s[j]==i)
{
if(j==n-i) break; //如果已经就位则不需要进一步处理
if(j!=n-1) //不在顶端则先将该煎饼翻转至顶部
{
reverse(j);
cout<<j+1<<" ";
}
reverse(n-i);
cout<<n-i+1<<" ";
break;
}
}
}
cout<<0<<endl;
}
}