码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-16 21:53:47      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

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










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

标签:

原文地址:http://blog.csdn.net/nike0good/article/details/45771379

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!