1252:走迷宫
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 16764 通过数: 7598
【题目描述】
一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
【输入】
第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用‘.’表示,有障碍物的格子用‘#’表示。
迷宫左上角和右下角都是‘.’。
【输出】
输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
【输入样例】
5 5
..###
#....
#.#.#
#.#.#
#.#..
【输出样例】
9
【AC代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int INF=0x3f3f3f3f;
inline int read()
{
char ch=getchar();
int n=0,m=1;
while(ch<'0'||ch>'9')
{
if(ch=='-')m=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();
return n*m;
}
void write(int n)
{
if(n>9)write(n/10);
putchar(n%10+'0');
}
int r,c,dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct point
{
int px,py,pt;
};
queue<point> que;
char maze[45][45];
bool vis[45][45];
void bfs(int tx,int ty,int tt)
{
vis[tx][ty]=1;
que.push((point){tx,ty,tt});
while(!que.empty())
{
point p=que.front();
que.pop();
if(p.px==r&&p.py==c)
{
cout<<p.pt;
return;
}
for(int i=0;i<4;i++)
{
int nx=p.px+dir[i][0],ny=p.py+dir[i][1],nt=p.pt+1;
if(nx>0&&nx<=r&&ny>0&&ny<=c&&maze[nx][ny]=='.'&&vis[nx][ny]==0)
{
vis[nx][ny]=1;
que.push((point){nx,ny,nt});
}
}
}
}
int main(int argc,char **argv)
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)cin>>maze[i][j];
}
bfs(1,1,1);
return 0;
}