题意:
  输入一个整数n,表示有n组测试数据,
  每组第一行输入一个整数x表示该组测试一共有x页,接下来输入x行,每行表示一页,
  每页或者以C开头(第一页都是以C开头),或者以E开头,中间用引号括起一段文字。
  以C开头的末尾输入两个数字a,b表示该页完后可以跳转到第a页或第b页,
  以E开头的末尾输入一个单词,或者是HAPPY或者是GRISLY(有且仅有一页以HAPPY结尾)。
  现在要求你根据输入找出以第一页开头,以HAPPY结尾的路径,输出路径上每一页中间引号里面的内容,不包含引号。

思路:建立树,用dfs深搜。
  要注意的是数据中可能会有死循环出现,会导致RE。。。

另外:本题读取句子可采用的方法:
cin.getline(page[j],258,'\"')
参考网址
http://hi.baidu.com/kskr/blog/item/cb00cc3deadf45c49f3d6279.html

#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm> const int maxn=;
using namespace std;
int t,n;
int endnum; //以HAPPY结尾的页数
int pri[maxn]; //前驱
bool ok; //标记是否已经找到路径
int vis[maxn]; //标记该页数是否被访问过 struct Page{
int mark;
char sentence[];
int len;
int son[]; //跳转的页码
char ending[];
bool flag; //flag为true表示该页是HAPPY
}page[maxn]; void dfs(int u){
if(ok)
return;
vis[u]=; //没用vis标记前,RE;后来网上查了,有人说数据中有循环,便加上了标记,结果WA,忘记输出STORY X了。。。
if(page[u].mark){
for(int i=;i<;i++){
int v=page[u].son[i];
if(!vis[v]){
pri[v]=u;
dfs(v);
}
}
}
else{
if(page[u].flag){
ok=true;
endnum=u;
}
}
}
int main()
{
char s[];
char c;
int len;
cin>>t;
for(int q=;q<=t;q++){
cout<<"STORY "<<q<<endl;
memset(pri,-,sizeof(pri));
memset(vis,,sizeof(vis));
cin>>n;
for(int i=;i<=n;i++){
scanf("%s",s);
page[i].mark=;
if(s[]=='C'){
page[i].mark=;
c=getchar();
while(c!='"')
c=getchar();
len=;
//读取双引号里的句子
while((c=getchar())!='"')
page[i].sentence[len++]=c;
page[i].len=len;
scanf("%d%d",&page[i].son[],&page[i].son[]);
}
else{
c=getchar();
while(c!='"')
c=getchar();
len=;
//读取双引号里的句子
while((c=getchar())!='"')
page[i].sentence[len++]=c;
page[i].len=len; scanf("%s",page[i].ending);
if(strcmp(page[i].ending,"HAPPY")==){
page[i].flag=true;
}
else{
page[i].flag=false;
}
}
}
pri[]=;
ok=false;
dfs();
int idx=;
int res[maxn];
res[idx++]=endnum;
//存储路径
while(pri[endnum]!=endnum){
res[idx++]=pri[endnum];
endnum=pri[endnum];
}
for(int i=idx-;i>=;i--){
for(int j=;j<page[res[i]].len;j++){
cout<<page[res[i]].sentence[j];
}
cout<<endl;
}
}
return ;
}

POJ 2023 Choose Your Own Adventure(树形,dfs,简单题)的更多相关文章

  1. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  2. test1.A[【dfs简单题】

    Test1.A Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 sdut 2274:http://acm.sdut.edu.cn/ ...

  3. LeetCode Generate Parentheses 构造括号串(DFS简单题)

    题意: 产生n对合法括号的所有组合,用vector<string>返回. 思路: 递归和迭代都可以产生.复杂度都可以为O(2n*合法的括号组合数),即每次产生出的括号序列都保证是合法的. ...

  4. hdu 1561 The more, The Better 背包型树形DP 简单题

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. Curling 2.0(DFS简单题)

    题目链接: https://vjudge.net/problem/POJ-3009 题目描述: On Planet MM-21, after their Olympic games this year ...

  6. HDU1241&POJ2386 dfs简单题

    2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块 因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的 ...

  7. POJ 3370 Halloween treats( 鸽巢原理简单题 )

    链接:传送门 题意:万圣节到了,有 c 个小朋友向 n 个住户要糖果,根据以往的经验,第i个住户会给他们a[ i ]颗糖果,但是为了和谐起见,小朋友们决定要来的糖果要能平分,所以他们只会选择一部分住户 ...

  8. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  9. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

随机推荐

  1. angularjs2 学习笔记(一) 开发环境搭建

    开发环境,vs2013 update 5,win7 x64,目前最新angular2版本为beta 17 第一步:安装node.js 安装node.js(https://nodejs.org/en/) ...

  2. uva 11186 Circum Triangle<叉积>

    链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  3. Oracle ODP.NET连接池

    数据库连接池 连接池是数据库连接的缓存,每当应用程序需要连接数据库时向连接池申请数据库连接,连接池负责具体数据库连接的创建和销毁.连接池中的数据库连接会缓存一段时间,后续的连接请求首先使用缓存中的数据 ...

  4. Go安装

    http://www.linuxidc.com/Linux/2015-02/113159.htm https://github.com/astaxie/beego http://www.sizeofv ...

  5. django-pagination的使用

    1.安装django-pagination 2.将文件夹pagination复制到项目的根目录下 3.修改settings: 1.将 'pagination.middleware.Pagination ...

  6. 58.xilinx原语DCM,PLL的使用

    DCM_BASE 基本数字时钟管理模块的缩写,是相伴和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理.如需要频率和相位动态配置,则可以选用DCM_ADV原语,如需要相位动态偏移,可使用 ...

  7. 将inline、template声明和定义在头文件中

    如果要在要在源文件(a.cpp)中内联的展开一个函数(fun),则该源文件(a.cpp)中必须包含此函数(fun)的定义.如果要在多个文件中内联的展开fun,则在所有的源文件中都必须包含fun的定义. ...

  8. java笔试题(4)

    abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? abstract的method 不可以是static的,因为抽象的方法是要被子 ...

  9. linux打包压缩命令汇总

    tar命令 [root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令 ...

  10. jsp或Action获取请求参数中文乱码

    普通情况下,中文字符会被自动转换成iso-8859-1的编码格式通过网络传输,而这种格式是没办法直接表示出我们认识的中文字符的,所以还要手动将他转换回之前的字符集. 一般在servlet或者actio ...