uva 10152
乌龟王国的乌龟总是一只一只叠在一起。唯一改变乌龟位置的方法为:一只乌龟爬出他原来的位置,然后往上爬到最上方。给你一堆乌龟原来排列的顺序,以 及我们想要的乌龟的排列顺序,你的任务是按照先后次序列出出哪只乌龟需往上爬,使得可以产生所要的乌龟排列顺序,且爬的动作要发生最少。
Input
输入的第一列有一个整数,代表以下有多少组测试资料。每组测试资料的第一列有1个整数 n (n<=200),代表乌龟的数目。接下来的 n 列每列有一只乌龟的名字(乌龟名字均为唯一,且仅包含字符、空白、句点,长度不会超过80个字符),代表原来乌龟排列的顺序(由上到下)。再接下来的 n 列每列也有一只乌龟的名字,代表我们想要的乌龟排列顺序(也是由上到下)。请参考Sample Input。
Output
对每组测试资料输出一序列乌龟的名字,每个名字一列,代表往上爬的乌龟顺序。这个顺序可以使输入中原来的乌龟顺序变成我们想要的乌龟顺序,且此序列 越短越好。如果有不只一组解答,任何一组都可以。每组测试资料之后亦请输出一空白列,请参考Sample Output。
Sample Input
2 3 Yertle Duke of Earl Sir Lancelot Duke of Earl Yertle Sir Lancelot 9 Yertle Duke of Earl Sir Lancelot Elizabeth Windsor Michael Eisner Richard M. Nixon Mr. Rogers Ford Perfect Mack Yertle Richard M. Nixon Sir Lancelot Duke of Earl Elizabeth Windsor Michael Eisner Mr. Rogers Ford Perfect Mack
Sample Output
Duke of Earl Sir Lancelot Richard M. Nixon Yertle
#include<iostream> #include<map> #include<string> #include<vector> #include<algorithm> using namespace std; struct shell { string name; int rank; }; int main() { int sum; cin>>sum; cin.ignore(); while(sum--) { int n,i,j; cin>>n; cin.ignore(); string temp; shell sh[260]; map<string,int>m; for(i=n;i>0;i--) { getline(cin,temp); sh[i].name=temp; sh[i].rank=0; } for(i=n;i>0;i--) { getline(cin,temp); m.insert(make_pair(temp,i)); } for(i=1;i<=n;i++) { sh[i].rank=m[sh[i].name]; } int flag=1; int flag2=n+1,flag3=0; while(flag<=n) { for(i=1;i<=n;i++) { if(sh[i].rank==flag) { for(j=i;j<=n;j++) { if(sh[j].rank<flag) { flag2=flag; flag3=1; break; } if(flag3)break; } if(flag3)break; } if(flag3)break; } if(flag3)break; flag++; } for(j=flag2;j<=n;j++) { for(i=1;i<=n;i++) { if(sh[i].rank==j) { cout<<sh[i].name<<endl; break; } } } cout<<endl; } return 0; }