Problem 2285 迷宫寻宝
Accept: 237 Submit: 878
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上、下、左、右)。现洪尼玛在迷宫的入口处,问他最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。
Input
多组测试数据。
每组数据输入第一行为正整数n,表示迷宫大小。
接下来n行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'#'表示该位置为墙壁,字符'S'表示该位置为入口,字符'E'表示该位置为宝藏,输入数据中只有这四种字符,并且'S'和'E'仅出现一次。
n≤1000
Output
输出拿到宝藏最少需要走的步数,若永远无法拿到宝藏,则输出-1。
Sample Input
5 S.#.. #.#.# #.#.# #...E #....
Sample Output
7
Source
福州大学第十五届程序设计竞赛_重现赛
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 1010
char mapp[MAXN][MAXN];
int visit[MAXN][MAXN];
int dirx[4]={-1,1,0,0};
int diry[4]={0,0,-1,1};
int n;
struct Node
{
int x,y,step;
};
queue<Node> q;
Node s,e;
int cheak(struct Node X)
{
if(X.x<0||X.x>=n||X.y<0||X.y>=n||mapp[X.x][X.y]=='#'||visit[X.x][X.y]==1)
return 0;
return 1;
}
int bfs()
{
while(!q.empty()) //多组数据要清空
{
q.pop();
}
Node a,b;
a.x=s.x,a.y=s.y,a.step=0;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==e.x&&a.y==e.y) return a.step; //return 是在pop的时候就return
for(int i=0;i<4;i++)
{
b.x=a.x+dirx[i];
b.y=a.y+diry[i];
if(cheak(b))//判断下一个点是否可走
{
b.step=a.step+1;
visit[b.x][b.y]=1;
q.push(b);
}
}
}
return -1; //找不到输出-1;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<n;j++)
{
scanf("%c",&mapp[i][j]);
if(mapp[i][j]=='S')
s.x=i,s.y=j;
if(mapp[i][j]=='E')
e.x=i,e.y=j;
}
}
memset(visit,0,sizeof(visit));
int ans=bfs();
printf("%d\n",ans);
}
return 0;
}