迷宫的最短路线(BFS)
题目:给定一个大小为n*m的迷宫。迷宫由通道和墙壁足证,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需要的最小步数。请注意,本体假定从起点一定可以移动到终点。
限制条件:n,m<100
思路:
1.初始化迷宫maze[i][j],并对其每一个位置附上一个很大的值来表示状态d[i][j](有没有走过)。
2.取起点坐标将其加入队列que
3.用while循环体
1)取出队首元素,并将其出队(如果是终点,那直接break)
2)用for循环来遍历上下左右4个方向,找出符合条件的坐标,并把到该位置的距离确定到p的距离+1(不超出迷宫范围,该坐标还不是终点坐标,该坐标还没有走过)
4.return d[gx][gy]
代码:
<span style="font-size:18px;">#include <iostream>
#include <queue>
using namespace std;
const int inf=100000000;
const int max_n=100,max_m=100;
int n,m;
int sx,sy;//起点坐标
int gx,gy;//终点坐标
char maze[max_n][max_m+1];//表示迷宫的字符串的数组
int d[max_n][max_m];//到各个位置的最短距离的数组
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//4个方向移动的向量
typedef pair<int,int> P; //使用pair表示状态时,使用typedef会更加方便一些
void solve();
int bfsn();
int main()
{
cin>>n>>m;
//初始化迷宫,并记录起点和终点的坐标
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
{
cin>>maze[i][j];
if (maze[i][j]=='S') {sx=i;sy=j;}
else if (maze[i][j]=='G') {gx=i;gy=j;}
}
solve();
return 0;
}
void solve()
{
int res=bfsn();
cout<<"最短路径是:"<<res<<endl;
}
//求从(sx,sy)到(gx,gy)的最短距离
//如果无法到达,则是inf
int bfsn()
{
queue<P> que;
//把所有位置都初始化为inf
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
d[i][j]=inf;
//将起点加入队列,并把这一地点的距离设置为0
que.push(P(sx,sy));
d[sx][sy]=0;
//不断循环直到队列长度为0
while (que.size())
{
//从队列的最前端取出元素
P p=que.front();//取队首元素
que.pop();//出队
//如果取出的状态已经是终点,则结束搜索
if (p.first==gx && p.second==gy) break;
//四个方的向循,把符合条件的方向都入队
for (int i=0;i<4;i++)
{
//移动之后的位置记为(nx,ny)
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if (0<=nx && nx<=n && 0<=ny && ny<=m && maze[nx][ny]!='#' && d[nx][ny]==inf)
{
//可以移动的话,则加入到队列,并且到该位置的距离确定为到p的距离+1
que.push(P(nx,ny));//入队
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
return d[gx][gy];
}</span>
本题应用了BFS(广度优先搜索),队列,还应用了typedef,pair
关于typedef和pair,之后再说明