/**
* poj2023 DFS
* 就是以前小时候常玩的那种做选择题然后翻页的那货,把每一页的内容都记下来以后用DFS的方法往下走就行了.
* 第一个稍微麻烦的地方是输入,想办法把引号过掉,我这就用了最最原始的办法
* 第二个是可能会有循环的,或者貌似有多个解的,因此有正确答案以后要把正确答案的exist也设成true,这样只打印一次就行了,因为这个WA了3次
*/
#include <cstdio>
#include <cstring>
using namespace std;
struct page{
char type;
char content[257];
int a;//当为C类时,a b分别为跳转的两个页面,当为E类时,a为1表示HAPPY 为0表示Gd
int b;
} p[101];
int path[101];
bool exist[101];
void dfs(int x,int stepnum){
if(exist[x]){
return; //该路线已经走过
}
if(p[x].type == 'E' && p[x].a == 1){
//找到Happy ending,打印输出
for(int i=0;i<stepnum;++i){
printf("%s\n",p[path[i]].content);
}
printf("%s\n",p[x].content);
exist[x] = true;//就是这句话
return ;
}
else if(p[x].type == 'E' && p[x].a == 0){
//GRISLY
return;
}
else if(p[x].type == 'C'){
//p[x].type == 'C'
exist[x] = true;
path[stepnum] = x;
dfs(p[x].a,stepnum+1);
dfs(p[x].b,stepnum+1);
exist[x] = false;
}
}
int main(){
int t,k;
char ending[10];
char temp;
int idx;
scanf("%d",&t);
for(int tt=1;tt<=t;++tt){
scanf("%d",&k);
memset(p,0,sizeof(p));
memset(path,0,sizeof(path));
memset(exist,0,sizeof(exist));
for(int i=1;i<=k;++i){
idx = 0;
temp = 0;
getchar();//\n
scanf("%c",&p[i].type);
getchar();//
getchar();//"
while(temp!='"'){
scanf("%c",&temp);
p[i].content[idx++] = (temp=='"')? 0 : temp;
}
switch(p[i].type){
case 'C':
scanf("%d%d",&p[i].a,&p[i].b);
break;
case 'E':
scanf("%s",ending);
p[i].a = (ending[0] == 'H') ? 1 : 0;
break;
default:
break;
}
}
printf("STORY %d\n",tt);
dfs(1,0);
}
return 0;
}
poj2023 DFS
最新推荐文章于 2020-12-22 11:36:28 发布