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");
}
}