标签: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