1254:走出迷宫
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 9105 通过数: 4245
【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n×m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.
’表示空地,‘#
’表示墙,‘S
’表示起点,‘T
’表示出口。
【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3
S#T
.#.
...
【输出样例】
6
【分析】
迷宫问题可以用dfs,也可以用bfs实现,本题数据量比较大,只能用bfs实现,dfs超时。
【参考代码】
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
char a[100][100]; // 原地图
bool v[100][100]; // 访问数组
struct point
{
int x,y; // 坐标
int step; // 步数
};
queue <point> r; // 申请队列
int dx[4]={0,1,0,-1}; // 方向数组,右,下,左,上
int dy[4]={1,0,-1,0};
int startx,starty; // 起始点坐标
int p,q; // 终点坐标
int m,n;
void bfs()
{
point s; // 初始化队列
s.x=startx;
s.y=starty;
s.step=0;
r.push(s); // 起点入队
v[startx][starty]=1;
while(!r.empty()) // 判断队列是否为空
{
point t,tmp;
t=r.front();
if(t.x==p && t.y==q) // 判断是否是终点
{
cout << t.step << endl;
return;
}
for(int k=0;k<4;k++) // 四个方向
{
tmp.x=t.x+dx[k];
tmp.y=t.y+dy[k];
if(tmp.x>=1 && tmp.x<=m && tmp.y>=1 && tmp.y<=n && a[tmp.x][tmp.y]=='.' && v[tmp.x][tmp.y]==false) // 判断能不能走
{
// 入队处理
tmp.step=t.step+1;
r.push(tmp); // 入队
v[tmp.x][tmp.y]=true; // 标记
}
}
r.pop(); // 拓展完了,需要将队首元素出队
}
}
int main()
{
int i,j;
scanf("%d%d",&m,&n);
getchar();
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%c",&a[i][j]); // '.'表示空地,'#'表示障碍物
if(a[i][j]=='S')
{
startx=i;
starty=j;
a[i][j]='.';
}
if(a[i][j]=='T')
{
p=i;
q=j;
a[i][j]='.';
}
}
getchar();
}
v[startx][starty]=true;
bfs();
return 0;
}