迷宫寻宝(一)
2015-06-04 18:57
369 查看
描述
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
输入输入可能会有多组测试数据(不超过10组)。
每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:
.表示可以走的路
S:表示ACM的出发点
G表示宝藏的位置
X表示这里有墙,ACM无法进入或者穿过。
A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。
注意ACM只能在迷宫里向上下左右四个方向移动。
最后,输入0 0表示输入结束。输出每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。样例输入
样例输出
ac代码:
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
输入输入可能会有多组测试数据(不超过10组)。
每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:
.表示可以走的路
S:表示ACM的出发点
G表示宝藏的位置
X表示这里有墙,ACM无法进入或者穿过。
A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。
注意ACM只能在迷宫里向上下左右四个方向移动。
最后,输入0 0表示输入结束。输出每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。样例输入
4 4 S.X. a.X. ..XG .... 3 4 S.Xa .aXB b.AG 0 0
样例输出
YES NO
ac代码:
#include<iostream> #include<cstring> using namespace std; struct node { int b; int c; int num; }arry[5]; char a[25][25]; int keynum[5]; int have[5]; int bz;//宝藏找到的标志 void jc(); void dfs(int x,int y) { if(a[x][y]!='X')//没碰到墙 { if(a[x][y]>='a'&&a[x][y]<='e')//记录钥匙数量 {keynum[a[x][y]-'a']++;} else { if(a[x][y]>='A'&&a[x][y]<='E') //碰到门了 { arry[a[x][y]-'A'].b=x;//记录门的坐标 arry[a[x][y]-'A'].c=y; arry[a[x][y]-'A'].num++; return; } else {if(a[x][y]=='G')//碰到宝藏 {bz=1;return;} } } a[x][y]='X'; dfs(x-1,y); dfs(x+1,y); dfs(x,y-1); dfs(x,y+1); jc(); } } void jc() { for(int i=0;i<5;i++) { if(arry[i].num) { if(have[i]==keynum[i]) { a[arry[i].b][arry[i].c]='X'; dfs(arry[i].b+1,arry[i].c); dfs(arry[i].b-1,arry[i].c); dfs(arry[i].b,arry[i].c+1); dfs(arry[i].b,arry[i].c-1); } } } } int main() { int q,w,m,n,i,j; while((cin>>q>>w)&&(q||w)) { memset(a,'X',sizeof(a));//划分范围边界 memset(have,0,sizeof(have)); memset(keynum,0,sizeof(keynum)); memset(arry,0,sizeof(arry)); bz=0; for(i=1;i<=q;i++) for(j=1;j<=w;j++) { cin >>a[i][j]; if(a[i][j]>='a'&&a[i][j]<='e') have[a[i][j]-'a']++; else if(a[i][j]=='S')//记录起点 m=i,n=j; } dfs(m,n); if(bz) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
相关文章推荐
- java的一些网络知识2
- 大家知道,每年的双11,都是购物狂欢节。
- 判断 iOS 设备类型
- [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
- xcode6.3配置svn,详情教程,小白戳进来。
- UVA 1324 Bring Them There 拆点+打印解
- 搜狗输入法的评价
- Android中的文件下载——DownLoadManager
- Longest Substring Without Repeating Characters——经典题
- 常用EXE文件反编译工具
- 指向数组的指针
- Jenkins(二)
- 使用ReactiveCocoa限制UITextField只能输入正确的金额
- Codeforces Round #306 (Div. 2)
- 装B必备词汇
- 专利代理考前须知
- lightoj1079(数学概率与期望)
- spring security自定义过滤器
- 没有人会在意大数据是如何定义的!
- 诸葛告诉你如何用数据来做渠道效果的分析