莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 将所有起点放入队列,并将他们的距离置为 0
2. 取出队头,枚举四个方向,将符合条件的点放入队列,并更新距离
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;
int n,m;
char g[N][N];
int dist[N][N];
//枚举四个方向
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
void bfs()
{
queue<PII> q;
//初始化dist数组
memset(dist,-1,sizeof dist);
//将所有'1'放入队列,并更新距离
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]=='1')
{
q.push({i,j});
dist[i][j]=0;
}
while(q.size())
{
//取出队头
auto t=q.front();
q.pop();
//枚举四个方向
for(int i=0;i<4;i++)
{
int a=t.x+dx[i],b=t.y+dy[i];
//超出边界
if(a<0||a>=n||b<0||b>=m) continue;
//该点未被走过
if(dist[a][b]!=-1) continue;
//将符合条件的点放入队列,并更新距离
q.push({a,b});
dist[a][b]=dist[t.x][t.y]+1;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>g[i];
bfs();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++) cout<<dist[i][j]<<' ';
cout<<endl;
}
return 0;
}