C++ 代码+详细注释
#include<iostream>//PS:某行代码注释看不懂可以先跳过去,看完后边的注释,说不定就理解前边的内容了
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 110;
typedef pair<int,int> PII;
int n,m;// n*m的地图
int g[N][N],d[N][N];//g是地图,d[x][y]的值是[x][y]到[0][0]点的最短距离
int bfs()
{
queue<PII> q;
memset(d,-1,sizeof d);//标记没有走过的点 他到出发点(0,0)的距离为-1,
d[0][0] = 0; //初始化数据
q.push({0,0}); //从 (0,0)点出发,将该点存入到 队列 q 中
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; //从某一点可走的4个方向
while(q.size())// 如果 q队列 为空 ,则退出循环,说明已找到出路(最短)。
{
auto t = q.front();//新定义一个 队列 t 用于存储队列 q 的第一个值
q.pop(); //再删除队列 q 的队头,说明该点即将成为过去式(即走过该点)
for(int i=0;i<4;i++)//4个循环 判断4个方向哪一个可以走
{
int x=t.first+dx[i],y=t.second+dy[i];//用 x , y 记录走每一个方向的坐标
if(x>=0&&x<n&&y>=0&&y<m&&d[x][y]==-1&&g[x][y]==0)//判断该坐标是否可以走,d[x][y]==-1表示该点没走过,g[x][y]==0表示该点不是墙
{
d[x][y]=d[t.first][t.second]+1;//记录可以走的点到出发点的距离
q.push({x,y});//把可以走的点放入队列 q 中 ,然后接着让 q 中的点进行上述过程
}
}
}
return d[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;
}
有没有讲清楚的地方欢迎留言