POJ 2023 Choose Your Own Adventure(树形,dfs,简单题)
题意:
输入一个整数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,简单题)的更多相关文章
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- test1.A[【dfs简单题】
Test1.A Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 sdut 2274:http://acm.sdut.edu.cn/ ...
- LeetCode Generate Parentheses 构造括号串(DFS简单题)
题意: 产生n对合法括号的所有组合,用vector<string>返回. 思路: 递归和迭代都可以产生.复杂度都可以为O(2n*合法的括号组合数),即每次产生出的括号序列都保证是合法的. ...
- 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 ...
- Curling 2.0(DFS简单题)
题目链接: https://vjudge.net/problem/POJ-3009 题目描述: On Planet MM-21, after their Olympic games this year ...
- HDU1241&POJ2386 dfs简单题
2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块 因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的 ...
- POJ 3370 Halloween treats( 鸽巢原理简单题 )
链接:传送门 题意:万圣节到了,有 c 个小朋友向 n 个住户要糖果,根据以往的经验,第i个住户会给他们a[ i ]颗糖果,但是为了和谐起见,小朋友们决定要来的糖果要能平分,所以他们只会选择一部分住户 ...
- POJ 1155 TELE 背包型树形DP 经典题
由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
随机推荐
- wpf 获取DataGrid某一个单元格,设置此单元格ToolTip内容和背景颜色
public void GetCell() { for (int i = 0; i < this.datagrid1.Items.Count; i++) ...
- String.split()方法你可能不知道的一面
一.问题 java中String的split()是我们经常使用的方法,用来按照特定字符分割字符串,那么我们看以下一段代码: public void splitTest() { String str = ...
- centos6.4 安装 hive 0.12.0
环境:centos6.4 64bit, 前提:hadoop已经正常运行,可以使用hadoop dfsadmin -report查看 hive 解压 tar zcvf hive-0.12.0.ta ...
- 条款38:通过聚合设计has-a或者is-implemented-in-terms-of
聚合:类型之间的一种关系,就是一种类型内含有另一种类型的变量. has-a: class Address { }; class PhoneNumber { }; class Person { publ ...
- html 元素 变小手
要设置鼠标指针放在一个元素边界范围内时所用的光标形状,需要对元素的css属性cursor进行设置.cursor属性可能的值1.default 默认光标(通常是一个箭头)2.auto 默认.浏览器设置的 ...
- 快速生成R语言报告(markdown+Rstudio)
先预览一下用Markdown写的报告[http://rpubs.com/loness/167347],这是HTML格式,你也可以导出Word.pdf,但是导出pdf时文中不能有中文,但是可以使用“pd ...
- Oracle无法drop用户,提示有连接不能删除时
百度了一下,这个可以行得通 select username,sid,serial# from v$session alter system kill SESSION '133,169' ; drop ...
- Android -- 经验分享(二)
目录 自定义两个View进行画图,让 ...
- 11.6Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.817 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.818 实现视频浏览的功能 王 ...
- JavaScript DOM动态创建(声明)Object元素
http://www.cnblogs.com/GuominQiu/archive/2011/04/01/2002783.html 一文提及“等整个页面加载完毕后,根据用户所选的阅读机类型,再用Java ...