(紫书)uva120 模拟

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

猜你喜欢

转载自blog.csdn.net/keepcoral/article/details/80155331