https://vjudge.net/problem/UVA-120
题意在紫书上有,也可以google翻译一下,题意是给你一组数字,按照它的操作来排序,要求你输出操作顺序,只是一个简单模拟,但是要细心点,它给的数组是,最右边为底,最左边为顶,所以要从后开始遍历,输入也不是常规输入,要用到getchar,用输入流也可以。
我的做法,首先先用一个b数组存它的数字,然后排个序,b是对照用,从后开始遍历,找到一个不同的值,那么对它进行操作,首先我们要明确:如果要交换的数字是在第一个例如
5 4 3 2 1
它是第一个数字是最大的,那么也就是说,我们要翻第5个位置,翻到1 2 3 4 5,所以只需要翻一次就可以了
如果它第一个数字不是最大的例如
1 5 2 3 4
我们先要把最大的数字翻到第一个也就是,翻第二个数字,先变成 5 1 2 3 4 ,然后再翻第5个位置,变成4 3 2 1 5,这样子就可以把5放到最后一个位置,接着我们对第二大的数字进行排序,最大那个数字已经不用管了,再按上面两个步骤去进行就可以了。注意最后的输出就好了。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<cmath> using namespace std; int a[1009]; int b[1009]; int c[1009]; int main() { int i,j,k,n,t=0,x; while(scanf("%d",&x)!=EOF) { t=0; n=0; a[n++]=x; while(getchar()!='\n') { scanf("%d",&a[n++]); } for(i=0;i<=n-1;i++) b[i]=a[i]; sort(b,b+n); for(i=0;i<=n-1;i++) { if(i!=n-1)printf("%d ",a[i]); else printf("%d\n",a[i]); } /*for(i=0;i<=n-1;i++) { printf("%d ",b[i]); } printf("\n");*/ for(i=n-1; i>=0; i--) { if(a[i]!=b[i]) { for(j=0; j<=n-1; j++) { if(b[i]==a[j]) break; } //printf("j==%d\n",j); if(j!=0) { for(k=0; k<=j/2; k++) { swap(a[k],a[j-k]); } for(k=0; k<=i/2; k++) { swap(a[k],a[i-k]); } c[t++]=j; c[t++]=i; } else { for(k=0; k<=i/2; k++) { swap(a[k],a[i-k]); } c[t++]=i; } } } for(i=0;i<=t-1;i++) printf("%d ",n-c[i]); printf("0\n"); } }