NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(小女警的异世界之战-前序中序求后序)

来源:互联网 发布:组织架构软件visio 编辑:程序博客网 时间:2024/05/01 05:47
A - 小女警的异世界之战
Time Limit: 1000 ms        Memory Limit: 65536 KB
Submit
Description
这一天,小女警花花,泡泡和毛毛来到终极Boss"Him"所在的异世界并准备与其决一死战,却被困在了他的城堡里。她们发现异世界是一个巨大的城堡。城堡由一个个大小不同的房间组成,房间有着以下的规则:
每个房间有且仅有一扇黄门,此外至多有一扇红门和一扇绿门:黄色代表通向更大的房间,绿色和红色代表通向更小的房间。很显然,如果你打开了一扇红/绿色的门,你会发现门的背面是黄色的,反之同理。
红色和绿色的门都是可以随意打开的,然而黄色的门要等到该房间其他门均被打开过,且该房间怪物已经被杀死时才能被打开。在成功穿过黄门后,这扇门就会消失。
每个房间都会有一个怪物,小女警可自由挑选打败怪物的时机而不影响其打开该房间的红/绿门。
三位小女警的起点就是一间较为特殊的房间,这个房间与正常房间的区别是黄门是特制的。为了解锁这个房间的特殊黄门,三位小女警必须分别依次探索这个房间的其他门,而每个小女警在探索时,怪物与门的状态都会重置。三位小女警的探索方式有着巨大的差别:
花花对红色有着狂热的痴迷,因此当她看见红门时,会暂时无视怪物而立刻冲进去,但是当所在房间没有红门时,她会恢复理智并优先将所在房间的怪物杀死,然后进入绿门(如果有的话)来解锁黄门。
泡泡有强烈的强迫症而且讨厌绿色,当她看到怪物时一定会将其杀死,然后她会优先开启红门,不得已时她才会进入绿门来解锁黄门。
毛毛有拖延症,因此她会优先去开她喜爱的红色的门,随后去开绿色的门,当其所在房间没有门可开时,她才会通过杀死怪物的方式解锁黄门并回去。
每个房间的怪物都有独一无二的名字,当小女警杀死怪物时,怪物的名字会按顺序被记录在日志上,现在花花和泡泡已经按规则探索过了这个城堡,并回到了出发点,毛毛借来了她们的日志以便预测她将会碰到的怪物的顺序,你能帮助她完成这个任务吗?
 
Input
数据有多组,每组数据以一个数字n(1<=n<=100)为开始,代表有n条记录,
接下来的两行分别是花花和泡泡的日志,分别包含了n个怪物的名字,用空格隔开。
n==0时,输入结束。
 
Output
输出一行毛毛的日志,怪物名字之间用空格隔开。
Sample Input
5
skeleton zombie spider bat witch
bat zombie skeleton spider witch 
0
Sample Output
skeleton spider zombie witch bat
Hint

-


本题前序中序已知,求后序
注意:class str{char s[MAXN]}s; 这个函数不能写printf("%s",s)要写s.s *不报错



#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<functional>#include<iostream>#include<cmath>#include<cctype>#include<ctime>#include<map>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  #define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define MAXN (100+10)#define MAXL (1000+10) typedef long long ll;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int n;int h2[MAXN];class str{public://int i; char s[MAXL]; void mem(){s[0]=0;}friend bool operator<(str a,str b){return strcmp(a.s,b.s)<0;}friend bool operator==(str a,str b){return strcmp(a.s,b.s)==0;}}s1[MAXN],s2[MAXN];map<str,int> h;bool fl;void dfs(int l1,int r1,int l2,int r2) {if (l1<r1&&l2<r2){int p=h2[l2];int len1=p-l1;if (len1>0) dfs(l1,p-1,l2+1,l2+len1);if (r1-l1+1-len1-1>0) dfs(p+1,r1,l2+len1+1,r2);}if (fl) printf(" ");else fl=1; printf("%s",s2[l2].s);}int main(){//freopen("A.in","r",stdin);//freopen("A.out","w",stdout);while(scanf("%d",&n)==1){h.clear();if (n==0) return 0;For(i,n) s1[i].mem(),s2[i].mem();For(i,n) scanf("%s",s1[i].s);For(i,n){h[s1[i]]=i;}For(i,n){scanf("%s",s2[i].s);h2[i]=h[s2[i]]; }fl=0;dfs(1,n,1,n);printf("\n");}return 0;}










0 0
原创粉丝点击