uva 10152 ShellSort

//这个算法用到了“相对位置”的思想,并且就本题而言还有一个很重要的结论就是,假设

//移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知,

//越先移动的元素一定会越被压在移动的元素的底部

首先找到需要移动的字符串,方法如下:以初始序列为准,设初始序列下标为i, 目的序列下标为j, 从n-1开始,如果两下标对应的字符串相等,下标同时减一,否则仅初始序列下标减一。那么目的序列中还未被成功匹配的字符串就是需要移动的字符串。要使移动次数最少,显然应该按未被处理的目的序列中字符串逆序移动(输出)。

 

#include<cstdio>

#include<cstring>

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

const int N=210;

char orginal[N][100];

char required[N][100];



int main()

{

        int T;

        scanf("%d", &T); getchar();

        while(T--)

        {

                int n, i, j;

                scanf("%d", &n); getchar();//忽略换行,不然gets会返还空串

                for(i=0; i<n;i++)

                {

                        gets(orginal[i]);

                }

                for(i=0; i<n;i++)

                {

                        gets(required[i]);

                }



                for(i=j=n-1; i>=0;i--)

                {

                        if(!strcmp(orginal[i], required[j]))

                                j--;

                }



                for(;j>=0;j--)

                        puts(required[j]);

                printf("\n");



        }



    return 0;

}

你可能感兴趣的:(shell)