首页 > 代码库 > ShellSort UVA 10152

ShellSort UVA 10152

说说:

题意大概就是开始有一堆的字符串堆栈A,其中的任何一个字符串都可以从当前位置移动到栈顶,经过若干字符串的移动,最后形成了另一个字符串堆栈B,要求输出按顺序输出移动字符串最少的移动方案。其实解法挺简单的,既然要求的是最少的移动,那么就从B的底部开始逐个在A中从底部往上查找,并且要在A中标记查找位置,因为A中已经被查找过的字符串必然是要移动的。如此重复,直到B在原堆栈中找不到可以不移动的字符串。最后,B中剩下的都是移动过的字符串。因为字符串只能移动到顶部,因此从B中的当前位置逐个向顶部输出字符串,就是所求的结果啦。

源代码:

#include <stdio.h>
#include <string.h>
#define MAXN 200+5
#define MAXL 80+5

int main(){
   char origin[MAXN][MAXL],now[MAXN][MAXL];
   int T,n,i,p;
//   freopen("data","r",stdin);
   scanf("%d",&T);
   while(T--){
     scanf("%d\n",&n);
     for(i=0;i<n;i++)
      gets(origin[i]);
     for(i=0;i<n;i++)
      gets(now[i]);


     for(i=p=n-1;i>=0&&p>=0;){//p标记原堆栈的位置,i标记当前堆栈的位置
      while(p>=0)
        if(strcmp(now[i],origin[p])==0){
	  p--;
	  i--;//i的递减最好放在内部,否则可能会少输出一个字符串
	  break;
	}
	else 
	  p--;
     }

     for(;i>=0;i--)
      printf("%s\n",now[i]);

     putchar('\n');
   }

   return 0;
}


ShellSort UVA 10152