$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. 枚举距离当前点为1的所有点,符合条件就加入队列
2. 第一次枚举到的就是最短距离,最后返回终点
完整代码1
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 110;
int n,m;
int g[N][N],d[N][N];
PII q[N*N];
int bfs()
{
//初始化q数组
int hh=0,tt=0;
q[0]={0,0};
//初始化d数组
memset(d,-1,sizeof d);
d[0][0]=0;
//深搜的四个方向
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
while(hh<=tt)
{
//取出队头
auto t=q[hh++];
//枚举四个方向
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
//不符合条件的直接continue
if(x<0||x>=n||y<0||y>=m) continue;
if(g[x][y]||d[x][y]!=-1) continue;
d[x][y]=d[t.first][t.second]+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;
}
完整代码2
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 110;
int n,m;
int g[N][N],d[N][N];
queue<PII> q;
int bfs()
{
//初始化q队列
q.push({0,0});
//初始化d数组
memset(d,-1,sizeof d);
d[0][0]=0;
//深搜的四个方向
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
while(q.size())
{
//取出队头
auto t=q.front();
q.pop();
//枚举四个方向
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
//不符合条件的直接continue
if(x<0||x>=n||y<0||y>=m) continue;
if(g[x][y]||d[x][y]!=-1) continue;
d[x][y]=d[t.first][t.second]+1;
//将该点放入队列
q.push({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;
}