题目大意:煎饼要按照从小到大的顺序排列,只有一种调换顺序的方法,盛起一沓煎饼,整个翻转过来
解题过程:思路是,找到应该出在位置p的煎饼i,先将i翻转到top,再翻转到位置p,直到顺序完全正确为止,一次AC
正确代码:
# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>
//*
#define fin cin
#define fout cout
//*/
using namespace std;
/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
int cmp(const void * a,const void *b){
return (*(int*)a)-(*(int*)b);
}
void reverse(int * panc,int pos){
int temp;
for(int i=0;i<(pos+1)/2;i++){
temp=panc[i];
panc[i]=panc[pos-i];
panc[pos-i]=temp;
}
}
int find(int a,int*panc,int numofpanc){
for(int i=0;i<numofpanc;i++){
if(panc[i]==a) return i;
}
return numofpanc;
}
int order[30];
int panc[30];
char temp[300];
int main()
{
while(fin.getline(temp,300)){
int numofpanc=0;
int d=0;
int target,currentpos;
for(int i=0;i<strlen(temp);i++){
if(temp[i]==' '){
order[numofpanc]=panc[numofpanc]=d;
numofpanc++;
d=0;
}
else{
d=d*10+temp[i]-'0';
}
}
order[numofpanc]=panc[numofpanc]=d;
numofpanc++;
for(int i=0;i<numofpanc-1;i++){
fout<<panc[i]<<" ";
}
fout<<panc[numofpanc-1]<<endl;
qsort(order,numofpanc,sizeof(order[0]),cmp);
for(int i=numofpanc-1;i>=0;i--){
if(order[i]!=panc[i]){
// fout<<"不相符的位置是:"<<i<<endl;
target=i;
currentpos=find(order[i],panc,numofpanc);
// fout<<"当前位置为"<<currentpos<<endl;
if(currentpos==0){
fout<<numofpanc-target<<" ";
}
else{
fout<<numofpanc-currentpos<<" ";
fout<<numofpanc-target<<" ";
}
reverse(panc,currentpos);
reverse(panc,target);
}
}
fout<<"0"<<endl;
}
return 0;
}