题目链接:Acwing_173矩阵距离
涉及算法:多源BFS
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;
const int N = 1001, M = N * N;
char g[N][N];//存放图
PII q[M];//模拟队列
int n, m;
int dis[N][N];//存放最短距离
void bfs()
{
int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
int hh = 0, tt = -1;
memset(dis,-1,sizeof(dis));
for(int i=0;i<n;i++)//把图中所有的1全部放入队列
for (int j = 0; j < m; j++)
{
if (g[i][j] == '1') {
q[++tt] = { i,j };
dis[i][j] = 0;
}
}
//下面是正常的bfs流程
while (hh <= tt) {
PII t = q[hh++];//取队头
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 (dis[a][b] != -1) continue;
dis[a][b] = dis[t.x][t.y] + 1;
q[++tt] = { a,b };
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%s", g[i]);
bfs();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
printf("%d ", dis[i][j]);
printf("\n");
}
system("pause");
return 0;
}