UVa OJ ShellSort 10152 龟壳排序
给定一个源串和目标串,求如何用最少的移动次数来将源串变成目标串,为了理解方便,这里把原来的字符串序列,简化为数字序列,每次移动的数字只能放到最前面,如:
源串:1,2,3,4,5;
目标串:3,2,1,4,5;
那么移动序列为过程为:
源串:1,2,3,4,5;
(1)2,1,3,4,5;
(2)3,2,1,4,5;
源串经过以上两步变为目标串,其移动的次数为2,移动的数字为:2,3。
根据题目要求,只需要输出移动的数字即可,即:2,3。
解题思路:
逆序来思考,从栈底往栈顶考虑,即将目标串与源串失匹配的最大位置的数字及其所有最前数字逆序输出。
拿以上的举例的源串和目标串来说,在目标串中其失匹配的最大位置为 i = 1,则逆序输出该位置的数字及其最前的所有数字:2,3。
AC代码如下,仅供参考。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 100
char orgStr[MAXN*3][MAXN];
char reqStr[MAXN*3][MAXN];
int main(){
#ifdef LOCAL
freopen("10152_input.txt","r",stdin);
freopen("10152_output.txt","w",stdout);
#endif
int t,n;
int i,j;
int count;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d",&n);
getchar();
count=n-1;
for(j=0;j<n;j++)
gets(orgStr[j]);
for(j=0;j<n;j++)
gets(reqStr[j]);
for(j=n-1;j>=0;j--)
if(!strcmp(orgStr[j],reqStr[count]))
count--;
for(j=count;j>=0;j--)
printf("%s\n",reqStr[j]);
printf("\n");
}
return 0;
}