给出原本煎饼的排序,输出使得煎饼从小到大排列的翻煎饼方式。
翻煎饼就相当于颠倒序列中的一段连续子序列,每次都把没排好的需要排列在最下面的那个煎饼翻上来,然后再翻到相应的位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<iostream> #include<algorithm> #include<string> #include<vector> #include<sstream> using namespace std; vector<int> a,b; bool cmp(int x,int y){ return x>y; } void reverse(int n){ for(int i=0;i<(n+1)/2;++i) swap(a[i],a[n-1-i]); return; } bool read(){ string s; a.clear(),b.clear(); getline(cin,s); stringstream ss(s); int k,first=1; while(ss>>k){ if(first) first=0; else cout<<" "; cout<<k; a.push_back(k); } if(!a.size()) return false; cout<<endl; b=a; return true; } int main(){ ios::sync_with_stdio(false); while(read()){ int n=(int)a.size(); sort(b.begin(),b.end(),cmp); for(int i=0;i<n;++i){ int j=0; for(j=0;j<n;++j) if(a[j]==b[i]) break; if(j==n-1-i) continue; else if(j){ cout<<n-j<<" "<<i+1<<" "; reverse(j+1); reverse(n-i); } else{ cout<<i+1<<" "; reverse(n-i); } } cout<<"0"<<endl; } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **