标签:nyoj迷宫寻宝一bfs
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
4 4 S.X. a.X. ..XG .... 3 4 S.Xa .aXB b.AG 0 0
YES NO
终于把它AC了
#include<cstdio> #include<cstdlib> #include<cstring> #include<queue> using namespace std; char map[25][25]; int vis[25][25],A,B,C,D,E,use[10]; int m,n,mov[][2]={1,0,-1,0,0,1,0,-1}; int BFS(int x,int y){ int xx,yy,i,j,z; queue<int>Q;memset(vis,0,sizeof(vis)); z=x*m+y; Q.push(z);vis[x][y]=1; while(!Q.empty()){ z=Q.front();Q.pop(); x=z/m;y=z%m; for(i=0;i<4;++i){ xx=x+mov[i][0]; yy=y+mov[i][1]; if(xx>=0&&xx<m&&yy>=0&&yy<n&&vis[xx][yy]==0&&map[xx][yy]!='X'){ if(map[xx][yy]=='.'){ z=xx*m+yy;Q.push(z);vis[xx][yy]=1; } else if(map[xx][yy]=='G')return 1; else if(map[xx][yy]=='a'){A--;z=xx*m+yy;Q.push(z);vis[xx][yy]=1;map[xx][yy]='.';} else if(map[xx][yy]=='b'){B--;z=xx*m+yy;Q.push(z);vis[xx][yy]=1;map[xx][yy]='.';} else if(map[xx][yy]=='c'){C--;z=xx*m+yy;Q.push(z);vis[xx][yy]=1;map[xx][yy]='.';} else if(map[xx][yy]=='d'){D--;z=xx*m+yy;Q.push(z);vis[xx][yy]=1;map[xx][yy]='.';} else if(map[xx][yy]=='e'){E--;z=xx*m+yy;Q.push(z);vis[xx][yy]=1;map[xx][yy]='.';} else if(map[xx][yy]=='A'){ if(A==0){z=xx*m+yy;Q.push(z);vis[xx][yy]=1;} } else if(map[xx][yy]=='B'){ if(B==0){z=xx*m+yy;Q.push(z);vis[xx][yy]=1;} } else if(map[xx][yy]='C'){ if(C==0){z=xx*m+yy;Q.push(z);vis[xx][yy]=1;} } else if(map[xx][yy]=='D'){ if(D==0){z=xx*m+yy;Q.push(z);vis[xx][yy]=1;} } else if(map[xx][yy]=='E'){ if(E==0){z=xx*m+yy;Q.push(z);vis[xx][yy]=1;} } } } } return 0; } int main() { int i,j,k,startx,starty,endx,endy; while(scanf("%d%d",&m,&n)==2){ if(m==0&&n==0)break; A=B=C=D=E=0;getchar(); for(i=0;i<m;++i){ scanf("%s",map[i]); for(j=0;j<n;++j){ if(map[i][j]=='S'){ startx=i;starty=j;map[i][j]='.'; } else if(map[i][j]=='a')A++; else if(map[i][j]=='b')B++; else if(map[i][j]=='c')C++; else if(map[i][j]=='d')D++; else if(map[i][j]=='e')E++; } }int whither,ok=1;memset(use,0,sizeof(use)); if(A==0)use[1]=1; else if(B==0)use[2]=1; else if(C==0)use[3]=1; else if(D==0)use[4]=1; else if(E==0)use[5]=1; whither=BFS(startx,starty); if(whither==1){ printf("YES\n"); } else{ while(1){ if(A==0&&use[1]==0){ whither=BFS(startx,starty); use[1]=1;if(whither)break; } else if(B==0&&use[2]==0){ whither=BFS(startx,starty); use[2]=1;if(whither)break; } else if(C==0&&use[3]==0){ whither=BFS(startx,starty); use[3]=1;if(whither)break; } else if(D==0&&use[4]==0){ whither=BFS(startx,starty); use[4]=1;if(whither)break; } else if(E==0&&use[5]==0){ whither=BFS(startx,starty); use[5]=1;if(whither)break; } else break; } if(whither==1){ printf("YES\n"); } else printf("NO\n"); } } return 0; }
标签:nyoj迷宫寻宝一bfs
原文地址:http://blog.csdn.net/r1986799047/article/details/43409315