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;
}

 




posted @ 2012-05-03 21:22  open your eyes  阅读(220)  评论(0编辑  收藏  举报