多源bfs
// 思路
建立虚拟源点,将所有起点加入队列中
1.题目1
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1010;
typedef pair<int,int> PII;
int dis[N][N];
char g[N][N];
queue<PII> q;
int n,m;
void bfs()
{
memset(dis,-1,sizeof dis);
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
if(g[i][j] == '1')
{
dis[i][j] = 0;
q.push({i,j});
}
}
while(q.size())
{
PII t = q.front();
q.pop();
for(int i = 0; i < 4; i ++)
{
int x = t.first + dx[i],y = dy[i] + t.second;
if(x < 1 || x > n || y < 1 || y > m) continue;
if(dis[x][y] != -1) continue;
dis[x][y] = dis[t.first][t.second] + 1;
q.push({x,y});
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> g[i] + 1;
bfs();
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
cout << dis[i][j] << ' ';
}
cout << endl;
}
}