说说:
题意大概就是开始有一堆的字符串堆栈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; }
原文地址:http://blog.csdn.net/u011915301/article/details/39053333