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入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
随机推荐
- unix的策略与机制
策略同机制分离,接口同引擎分离 Linux/Unix设计理念提供的一种机制不是策略.如果说机制是一种框架,那么,策略就是填充框架的一个个具体实施.机制提供的就是一种开放而宽松的环境,而策略就是在这个环 ...
- linux kernel同步机制的思考
在学习内核同步机制的时候,书中介绍了同步方法:原子操作(atomic).自旋锁(spinlock).信号量(semaphore).互斥锁(mutex).完成变量(completion).大内核(BLK ...
- libmemcached upcoming ISO C++ standard, C++0x
在编译我的小程序的时候,触发了一个编译错误,程序中使用了libmemcached,错误如下: 1 2 3 4 5 6 7 8 9 In file included from /usr/lib/gcc/ ...
- php判断来源网址地址并且限制非法来源
$fromHost = array( 'paipai.com', 'localhost', '127.0.0.1' ); $s = 'http://www.paipai.Com/chong/abc.s ...
- [DllImport("kernel32.dll")]是什么意思??
转载自:http://blog.csdn.net/sp6645597/article/details/8683737 1.简单说明 这叫引入kernel32.dll这个动态连接库(顾名思义就是一个链接 ...
- [vsftp服务]——ftp虚拟用户、权限设置等的实验
搭建ftp服务器,满足以下要求: 1.允许匿名用户登录服务器并下载文件,下载速度设置为最高2MB/s 2.不允许本地用户登录ftp服务器 3.在服务器添加虚拟用户vuser01.vuser02.vus ...
- 使用git客户端获取shiro
1.进入下载的目标文件夹右键( Git Bash Here )
- 手把手教你自动生成Makefile
概述:autoconf/automake工具用于自动创建功能完善的Makefile文件,接下来简单介绍一下,如何使用上述工具 自动生成Makefile 前提:安装autoconf工具(ubuntu:s ...
- 【Recover Binary Search Tree】cpp
题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...
- android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
问题说明: AndroidRuntime(1705): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.e ...