NYOJ迷宫寻宝(一)【BFS】

迷宫寻宝(一)

时间限制:1000 ms  |  内存限制:65535 KB

难度:4

描述

一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。

输入
输入可能会有多组测试数据(不超过10组)。

每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:

.表示可以走的路

S:表示ACM的出发点

G表示宝藏的位置

X表示这里有墙,ACM无法进入或者穿过。

A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。

注意ACM只能在迷宫里向上下左右四个方向移动。

最后,输入0 0表示输入结束。

输出
每行输出一个YES表示ACM能找到宝藏,输出NO表示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;
}        
时间: 2024-10-19 20:58:09

NYOJ迷宫寻宝(一)【BFS】的相关文章

NYOJ 迷宫寻宝(一)深搜

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 做这道题的时候迷迷糊糊的,,果然比较难..最后也是没有做出来..请教了一下学长,学长说我基础还不好..基础果然重要,这道题是一道搜索题,我没有考虑钥匙在门后面的情况,比如aBbSAG 多亏学长指教,通过这道题对深搜的理解又加深了一步~ #include <iostream> #include <cstdio> #include <cstring> using

nyoj迷宫寻宝(一)

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 struct node{ 9 int x,y; 10 }; 11 queue<node> q; 12 char maze[25][25]; //地图 13 int key[5

NYOJ 迷宫寻宝(一)

# include<iostream> # include<string> # include<string.h> # include<queue> # include<stdio.h> # include<math.h> #include <algorithm> using namespace std; char d[30][30]; int a[5],b[5]; struct Node { int x,y; int n

nyoj 82 迷宫寻宝(一) 【BFS】

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入

nyoj 82迷宫寻宝(一)

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入

迷宫寻宝(一) BFS

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入

NYOJ82 迷宫寻宝(一)【BFS】

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入

nyoj 82 迷宫寻宝(一)

迷宫寻宝(一) 时间限制:1000 ms  |            内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺

迷宫寻宝(一)

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入 输