题目比较简单,容易弄混顺序之间的关系
原理是从后向前扫描,当遇到不符合顺序的,就把它移动到合适的地方,这样从后向前,就一定能排出符合顺序的煎饼果子。
题目链接:https://uva.onlinejudge.org/external/1/120.pdf
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int t=1,steps[105],step=0;
bool comp(int a,int b){
return a>b;
}
void flip(int *a, int n){
for(int i=1;i<=n/2;i++)
swap(a[i], a[n-i+1]);
}
int getMax(int *a, int n){
int maxN = n;
for(int i=1;i<=n;i++){
if(a[i]>a[maxN]) maxN=i;
}
return maxN;
}
void print(int *a){
cout<<"\n\n===============\n\n";
for(int i=1;i<=t;i++)
printf("%2d",a[i]);
cout<<"\n\n===============\n\n";
}
int main(){
// freopen("./cin", "r",stdin);
// freopen("./cout", "w", stdout);
int n;char c;
int a[105],temp[105];
while (scanf("%d%c",&n,&c)!=EOF) {
a[t]=n;
if(c=='\n'){
for(int i=1;i<=t;i++)
temp[i]=a[i];
printf("%d",a[1]);
for(int i=2;i<=t;i++)
printf(" %d",a[i]);
printf("\n");
sort(temp+1, temp+t+1);
for(int i=t;i>=1;i--){
if(a[i]!=temp[i]){
int maxN = getMax(a, i);
flip(a, maxN);
if(maxN!=1)
printf("%d ",t-maxN+1);
flip(a, i);
printf("%d ",t-i+1);
}
}
printf("0\n");
t=1;
step=0;
}else t++;
}
return 0;
}