分析:
宽搜,权值为1,特殊的最短路
1、基本思路
2、代码
#include <iostream>
#include <algorithm>
#include <cstring>//memset
#include <queue>
using namespace std;
const int N = 110;
//1、定义,g[][]存储地图,d[][]存储每个点到起点的距离
int g[N][N] , d[N][N];
//2、定义一个pair队列
typedef pair<int,int> PII;
queue<PII> q;
int n , m;
//3、宽搜
int bfs()
{
//1.pair结构队列里面装的就是能够扩展的每个点的坐标
q.push({0,0}); //宽搜的起点放入队列
memset( d , -1 , sizeof d );//初始化距离为-1,表示这个点还没走过
d[0][0] = 0 ;//初始起点距离为0
//2.while循环,队列不空,取队头
int dx[4] = {-1 , 1 , 0, 0} , dy[4] = {0 , 0, -1 ,1};//向量表示向上,下,左,右
while( q.size() )
{
auto t = q.front();
q.pop();
//3.枚举一下四个位置
for( int i = 0 ; i<4 ; i++ )
{
int x = t.first + dx[i] , y = t.second + dy[i];
//4.没出边界并且这个点是空地并且还没有走过的话,才能扩展这个点
if(x>=0 && x<n && y>=0 && y<m && g[x][y] == 0 && d[x][y] == -1)
{
d[x][y] = d[t.first][t.second] + 1;
q.push({x , y});//将能够扩展的点都插入队列中,
}
}
}
//4.第一次搜到终点的就是最短距离
return d[n-1][m-1];//下标0开始存储,下标[n-1][m-1]对应最右下角的位置
}
int main()
{
cin>>n>>m;
for( int i = 0 ; i<n ; i++ )
for( int j = 0 ; j<m ; j++ )
cin>>g[i][j];
cout<< bfs() <<endl;
return 0;
}
3、模拟过程
太容易遗忘啦hh
我将永远不会忘记这一切!即使有一天我要远走他乡,但愿我还能在梦中再回到这里来......
---《平凡的世界》第三十五章