1252:走迷宫时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6997 通过数: 3112 【题目描述】一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。 【输入】第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫。 空地格子用‘.’表示,有障碍物的格子用‘#’表示。 迷宫左上角和右下角都是‘.’。 【输出】输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。 【输入样例】5 5 ..### #.... #.#.# #.#.# #.#.. 【输出样例】9 【来源】No |
#include<bits/stdc++.h>
#define MAXN 220
using namespace std;
int vis[MAXN][MAXN];
char mp[MAXN][MAXN];
int dis[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
int x;
int y;
int step;
};
int m,n;
queue<node> que;
void bfs(int sx,int sy,int ex,int ey)
{
node p,q;
p.x=sx;
p.y=sy;
p.step=1;
que.push(p);
while(!que.empty())
{
q=que.front();
que.pop();
int x,y,step;
x=q.x,y=q.y,step=q.step;
if(x==ex&&y==ey)
{
cout<<step<<endl;
break;
}
for(int i=0; i<4; i++)
{
int dx=x+dis[i][0];
int dy=y+dis[i][1];
if(dx>=0&&dx<m&&dy>=0&&dy<n&&!vis[dx][dy]&&mp[dx][dy]=='.')
{
vis[dx][dy]=1;
p.x=dx,p.y=dy,p.step=step+1;
que.push(p);
}
}
}
while(!que.empty())
{
que.pop();
}
return ;
}
int main()
{
cin>>m>>n;
memset(vis,0,sizeof(vis));
int sx,sy,ex,ey;
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cin>>mp[i][j];
}
}
sx=0,sy=0;
ex=m-1,ey=n-1;
vis[sx][sy]=1;
bfs(sx,sy,ex,ey);
return 0;
}