不用queue的写法:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 110;
typedef pair<int,int> PII;
#define x first
#define y second
int n,m;
int g[N][N];
int d[N][N];//记录每个点的距离
PII q[N * N];
int bfs()
{
memset(d,-1,sizeof d); //初始化d
int hh=0,tt=0;//初始化队头和队尾
d[0][0]=0; //从左上角第一个点开始搜索
q[hh]={0,0}; //将第一个点入队
int dx[4]={-1,0,1,0}; //偏移量数组
int dy[4]={0,-1,0,1};
while(hh <= tt)//当队非空
{
PII t = q[hh++];//获取队头元素,然后将其出队
for(int i=0;i<4;i++)
{
int x=t.x+dx[i];
int y=t.y+dy[i];
if(x >= 0 && y >= 0 && x < n && y < m && g[x][y] == 0 && d[x][y] == -1) //点未出界 该点可走 且未走过
{
d[x][y]=d[t.x][t.y]+1;
q[++tt]={x,y};
}
}
}
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;
}
用queue的写法:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 110;
int n,m;
int dist[N][N];
int g[N][N];
typedef pair<int,int> PII;
#define x first
#define y second
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int bfs()
{
memset(dist,-1,sizeof dist);
queue<PII> q;
q.push({0,0});
dist[0][0] = 0;
while(q.size())
{
PII t = q.front();
q.pop();
for(int i = 0;i < 4;i++)
{
int x = t.x + dx[i];
int y = t.y + dy[i];
if(x >= 0 && y >= 0 && x < n && y < m && dist[x][y] == -1 && g[x][y] == 0)
{
dist[x][y] = dist[t.x][t.y] + 1;
q.push({x,y});
}
}
}
return dist[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;
}