#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<algorithm>#include<queue>#include<cstring>usingnamespace std;constint N =110;int d[N][N], g[N][N];//d为数组保存点到起点的距离 g数组为迷宫int n, m;typedef pair<int,int> PII;//定义一个二元组intbfs(){
queue<PII> q;//定义一个队列
q.push({0,0});//起点入队memset(d,-1,sizeof(d));//开始时所有点距离初始化-1
d[0][0]=0;//起点距离为0int dx[4]={0,1,-1,0};int dy[4]={0,1,-1,0};//到一个点时,要上下左右都可以走,横纵坐标+-1或者不变 while(q.size())//队列不空时,开始循环{
PII t = q.front();//取队头元素
q.pop();//队头元素出队for(int i =0; i <4; i++){int x = t.first + dx[i], y = t.second + dy[i];if(x >=0&& y >=0&& x < n && y < m && g[x][y]==0&& d[x][y]==-1)//没有出界并且没有走过{
d[x][y]= d[t.first][t.second]+1;//改点距离为上一点距离加一
q.push({ x,y });//改点入队}}return d[n -1][m -1];//直接输出右下角的点}}intmain(){
cin >> n >> m;for(int i =0; i < n; i++){for(int j =0; j < m; j++){
cin >> g[i][j];}}
cout <<bfs()<< endl;return0;}
数组模拟队列
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;constint N =110;typedef pair <int,int>PII;int d[N][N], g[N][N];int n, m;
PII q[N*N];
PII pre[N][N];intdfs(){int hh =0, tt =0;memset(d,-1,sizeof d);
d[0][0]=0;
q[0]={0,0};int dx[4]={1,-1,0,0}, dy[4]={0,0,-1,1};while(hh <= tt){
PII t = q[hh++];for(int i =0; i <4; i++){int x = t.first + dx[i], y = t.second + dy[i];if(x >=0&& y >=0&& x < n && y < m && d[x][y]==-1&& g[x][y]==0){
q[++tt]={ x,y };
d[x][y]= d[t.first][t.second]+1;
pre[x][y]= t;}}}int x = n -1, y = m -1;while(x || y){
cout << x <<' '<< y << endl;
PII t = pre[x][y];
x = t.first, y = t.second;}return d[n -1][m -1];}intmain(){
cin >> n >> m;for(int i =0; i < n; i++){for(int j =0; j < m; j++)
cin >> g[i][j];}
cout <<dfs()<< endl;return0;}