»2.5基本算法之搜索(36题)
1159:Maze
#include<iostream> #include<cstring> #define MAX 22 /* 用dfs会出现先到达终点,但是钥匙没找完的情况 */ using namespace std; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int n,M; char t[MAX][MAX]; int vis[MAX][MAX]; struct Pos { int x,y; } s,m[5]; int key[5],r[5],locx[5],locy[5],flag=0; bool check() { for(int i=0; i<5; i++) if(key[i]!=r[i]) return 1; return 0; } void DFS(int posi,int posj) { if(t[posi][posj]=='G') { flag=1;return; } if(('A'<=t[posi][posj]&&t[posi][posj]<='E')||t[posi][posj]=='X'||posi<=0||posi>M||posj<=0||posj>n){ return; } if('a'<=t[posi][posj]&&t[posi][posj]<='e') { key[t[posi][posj]-'a']--; if(!key[t[posi][posj]-'a']) t[locx[t[posi][posj]-'a']][locy[t[posi][posj]-'a']]='.'; t[posi][posj]='.'; // if(!key[t[posi][posj]-'a']) t[m[t[posi][posj]-'a'].x][m[t[posi][posj]-'a'].y]='.'; } for(int i=0;i<4;++i) { if(vis[dx[i]+posi][dy[i]+posj]) continue; else vis[dx[i]+posi][dy[i]+posj]=1; DFS(dx[i]+posi,dy[i]+posj); if(flag) return; } } void inti() { memset(t,'X',sizeof(t)); memset(vis,0,sizeof(vis)); memset(key,0,sizeof(key)); memset(r,0,sizeof(r)); memset(m,0,sizeof(m)); flag=0; } int main() { while(~scanf("%d%d",&M,&n)) { if(M==0&&n==0) break; for(int i=1;i<=M;++i) { getchar(); for(int j=1;j<=n;++j) { cin>>t[i][j]; if(t[i][j]=='S'){ s.x=i;s.y=j; } if('a'<=t[i][j]&&t[i][j]<='e'){ key[t[i][j]-'a']++; }//保存一下每种钥匙的数量 if(t[i][j]>='A'&&t[i][j]<='E') locx[t[i][j]-'A']=i,locy[t[i][j]-'A']=j; //存放每一个门的位置 // if('A'<=t[i][j]&&t[i][j]<='E'){ m[t[i][j]-'A'].x=i; m[t[i][j]-'A'].y=j; }//保存一下门的位置 } } do { memcpy(r,key,sizeof(r)); memset(vis,0,sizeof(vis)); DFS(s.x,s.y); }while(check()); if(flag){ cout<<"YES\n"; } else { cout<<"NO\n"; } inti(); } return 0; }