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

        }

    return 0;
}
原文地址:https://www.cnblogs.com/cute/p/3613066.html