迷宫寻宝(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
-
描述
-
一个叫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
-
思路:
-
深搜能搜集到的钥匙
-
判断对应当钥匙是否已全
-
若已全 则将对应的门改成路
-
将得到的钥匙也改成路
-
最后判断是否可以到达终点;
-
注意容器用完后要清空
-
#include<bits/stdc++.h> using namespace std; int ac = 0; const int maxn = 55; int v[maxn][maxn]; char b[maxn][maxn]; int n,l; map<char,int>m; void dfs(int x,int y ) { if(ac) { return ; } if(x<=n&&x>=1&&y<=l&&y>=1) { if(b[x][y]=='G') { ac = 1; return ; } if(b[x][y]=='X') { return ; } if(b[x][y]>='a'&&b[x][y]<='e') { if(m[b[x][y]]) m[b[x][y]]--; b[x][y] = '.'; return ; } if(b[x][y]>='A'&&b[x][y]<='E') { if(m[b[x][y]+32]==0) {// printf("%c",b[x][y]+32); b[x][y] = '.'; } return ; } if(!v[x][y]) { v[x][y] = 1; dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); v[x][y] = 0; } } } int main() { while(scanf("%d%d",&n,&l)!=EOF) { //while(!m) for(int i ='a';i<='e';i++) { m[i]= 0; } if(n==0&&l==0) return 0 ; memset(b,0,sizeof(b)); memset(v,0,sizeof(v)); for(int i = 1; i<= n; i++) { scanf("%s",b[i]+1); } ac = 0; int cot = 0 ; int sx ,sy; for(int i = 1 ; i<= n; i++) { for(int j = 1; j<=l; j++) { if(b[i][j]=='S') { sx = i; sy = j; } if(b[i][j]>='a'&&b[i][j]<='e') { m[b[i][j]]++; } if( b[i][j]>='A'&&b[i][j]<='E') { cot++; } } } cot++; int out = 0 ; while(1) { int flag = 0; if(!cot) break; for(int i = 'a'; i<='e'; i++) if(m[i]>0) { dfs(sx,sy); if(ac) { out =1 ; break; } } if(ac ) { out = 1; break; } for(int i = 'a' ; i<='e' ; i++) { if(m[i]!=0) { flag = 1; } } if(!flag) { out = 1; break; } else { flag = 0 ; } cot--; } if(out) { printf("YES\n"); } else { printf("NO\n"); } } return 0 ; }
- 输入可能会有多组测试数据(不超过10组)。