nyoj82 迷宫寻宝(一) (bfs)
2017-09-28 18:59
507 查看
迷宫寻宝(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
输入
输入可能会有多组测试数据(不超过10组)。
每组测试数据的第一行包含了两个整数M,N(1
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
输入
输入可能会有多组测试数据(不超过10组)。
每组测试数据的第一行包含了两个整数M,N(1
分析:首先要得到目前所能获得的所有钥匙,首先考虑选择哪个搜索,发现dfs不行,不能回头,用bfs不需要考虑回头,每次都将所有地方加入队列,满足条件,然后就是对门的处理,如果当前点是门,判断门是否能打开,能打开,则继续走,如果不能打开,再次将其入队(因为标记之后,走过的点不能再走),用于下一次判断,如果队列为空,门还不能走,此时就表示这个门是开不了的了,此时直接返回NO
#include<stdio.h> #include<string.h> #include<algorithm> #include<ctype.h> #include<queue> using namespace std; int n,m,sx,sy,ex,ey,go[4][2]= {{1,0},{0,1},{-1,0},{0,-1}},key[6]; char e[25][25]; bool vis[25][25]; struct node { int x,y; }; bool check(int x,int y) { if(x<0||x>=n||y<0||y>=m||vis[x][y]||e[x][y]=='X') return false; if(e[x][y]>='a'&&e[x][y]<='e')key[e[x][y]-'a']--; return true; } bool bfs() { node tmp,in; queue<node>q; tmp.x=sx,tmp.y=sy; vis[sx][sy]=true; q.push(tmp); while(!q.empty()) { node st=q.front(); q.pop(); if(e[st.x][st.y]=='G') return true; if(e[st.x][st.y]>='A'&&e[st.x][st.y]<='E') { if(!key[e[st.x][st.y]-'A']) e[st.x][st.y]='.'; else { if(q.empty())return false; else { q.push(st); continue; } } } for< db08 /span>(int i=0; i<4; i++) { tmp.x=st.x+go[i][0]; tmp.y=st.y+go[i][1]; if(!check(tmp.x,tmp.y))continue; vis[tmp.x][tmp.y]=true; q.push(tmp); } } return false; } int main() { while(~scanf("%d%d",&n,&m)&&n+m) { memset(vis,false,sizeof(vis)); memset(key,0,sizeof(key)); for(int i=0; i<n; i++) { scanf("%s",e[i]); for(int j=0; j<m; j++) { if(e[i][j]=='S') sx=i,sy=j; else if(e[i][j]>='a'&&e[i][j]<='e') key[e[i][j]-'a']++; } } printf(bfs()?"YES\n":"NO\n"); } return 0; }
相关文章推荐
- nyoj 82 迷宫寻宝(一) 【BFS】
- nyoj 82 迷宫寻宝(一)BFS
- NYOJ 82. 迷宫寻宝(一)(DFS/BFS)
- nyoj 82 迷宫寻宝(一) 【经典BFS】
- NYOJ 82 迷宫寻宝(一)(多次 bfs)
- NYOJ82 迷宫寻宝(一)【BFS】
- NYOJ82 迷宫寻宝(BFS)
- NYOJ 82 迷宫寻宝(一)(BFS)
- NYOJ 82:迷宫寻宝(一)(BFS)
- NYOJ82 迷宫寻宝(一)【BFS】
- 【BFS】迷宫寻宝(一)(nyoj-82)
- nyoj 82 迷宫寻宝 【bfs】
- NYOJ82 迷宫寻宝(一)(BFS)
- NYOJ 82【迷宫寻宝(一)】
- nyoj 82 迷宫寻宝(一)
- nyoj82 迷宫寻宝(一) (搜索)
- nyoj82寻宝迷宫(一)搜索DFS
- nyoj 82 迷宫寻宝(一)
- NYOJ -82 迷宫寻宝(一)
- nyoj-82-迷宫寻宝(一)