uva 120
插排思想,只要能最后达到要求就可以,不一定要最少次数
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=101; int a[maxn]; int main() { while(~scanf("%d",&a[0])) { int cnt=0; while(getchar()!='\n') { cnt++; scanf("%d",&a[cnt]); } cnt++; for(int i=0; i<cnt-1; i++) printf("%d ",a[i]); printf("%d\n",a[cnt-1]); int sun=0; for(int i=cnt-1; i>=0; i--) { int k=i; for(int j=i-1; j>=0; j--) { if(a[j]>a[k]) k=j; } if(k!=i) { if(k!=0)//要找的值不在最上端,要翻到最开端,然后再翻到i的位置 { for(int j=0; j<=k/2; j++) swap(a[j],a[k-j]); printf("%d ",cnt-k); for(int j=0; j<=i/2; j++) swap(a[j],a[i-j]); printf("%d ",cnt-i); } else//要找的值在最上端,直接翻到i的位置 { for(int j=k; j<=(i+k)/2; j++) swap(a[j],a[i-j]); printf("%d ",cnt-i); } } } printf("0\n"); } return 0; }