最后,输入0 0表示输入结束。
每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。
0 0
NO
POJ月赛改编
#include <stdio.h> #include <string.h> #include <queue> using namespace std; //地图 char map[25][25]; //遍历标记 bool vis[25][25]; //是否找到宝藏 bool result; //钥匙总数 int key[5]; //当前找到的钥匙总数 int curKey[5]; int n,m; int st_x,st_y; struct node { int x,y; bool exit; }door[5]; void check(); void dfs(int x,int y) { if(x<0||y<0||x>=m||y>=n||map[x][y]=='X'||vis[x][y]) return ; //遇到门 判断能不能开门 如果不能开门 入栈 if(map[x][y]>='A'&&map[x][y]<='E'&&curKey[map[x][y]-'A']<key[map[x][y]-'A']) { door[map[x][y]-'A'].x=x; door[map[x][y]-'A'].y=y; door[map[x][y]-'A'].exit=true; return ; } vis[x][y]=true; //找到一个钥匙 curkey[]+1 if(map[x][y]>='a'&&map[x][y]<='e') curKey[map[x][y]-'a']++; if(map[x][y]=='G') { result=true; return ; } dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); check(); } //地图找完后 回到门前再次判断是否可以开门 void check() { for(int i=0;i<5;i++) { if(door[i].exit) { if(curKey[i]==key[i]) { int x=door[i].x; int y=door[i].y; dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); } } } } int main() { while(~scanf("%d %d",&m,&n)) { if(m==0&&n==0) break; memset(key,0,sizeof(key)); memset(map,0,sizeof(map)); memset(vis,false,sizeof(vis)); memset(&door,0,sizeof(&door)); memset(curKey,0,sizeof(curKey)); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { char ch; scanf(" %c",&ch); map[i][j]=ch; if(ch>='a'&&ch<='e') key[ch-'a']++; if(ch=='S') st_x=i,st_y=j; } } result=false; dfs(st_x,st_y); if(result) printf("YES\n"); else printf("NO\n"); } return 0; }