算法提高课整理
CSDN个人主页:更好的阅读体验
本文同步发表于 CSDN | 洛谷 | AcWing | 个人博客
原题链接
题目描述
给定一个 01 矩阵,求矩阵中每个元素离 1
的最短曼哈顿距离。
输入格式
第一行两个整数
n
,
m
n,m
n,m。
接下来一个
n
n
n 行
m
m
m 列的 01 矩阵,数字之间没有空格。
输出格式
一个
n
n
n 行
m
m
m 列的矩阵,相邻数字之间用空格隔开。
数据范围
1
≤
n
,
m
≤
1000
1le n,mle 1000
1≤n,m≤1000
思路
先考虑从 0
的位置向外扩展。
发现这样的话较麻烦,于是改为考虑从 1
的位置用 BFS 向外扩展,并处理出所有的距离。
这种算法即为 “多源 BFS”。具体算法流程为:将所有源点都入队,然后正常跑 BFS。
具体细节见代码。
算法时间复杂度
AC Code
C
+
+
text{C}++
C++
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 1010;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int n, m;
char g[N][N];
int dist[N][N];
void bfs()
{
memset(dist, -1, sizeof dist);
queue<PII> q;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
if (g[i][j] == '1')
dist[i][j] = 0, q.push({i, j}); // 所有起点入队
while (q.size())
{
PII t = q.front();
q.pop();
for (int i = 0; i < 4; i ++ ) // 4方向扩展
{
int x = t.x + dx[i], y = t.y + dy[i];
if (x < 0 || x >= n || y < 0 || y >= m) continue; // 出界
if (dist[x][y] != -1) continue; // 已经被遍历过
dist[x][y] = dist[t.x][t.y] + 1; // 合法的话更新距离
q.push({x, y}); // 新点入队
}
}
}
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 ", dist[i][j]);
puts("");
}
return 0;
}
最后,如果觉得对您有帮助的话,点个赞再走吧!
原文地址:https://blog.csdn.net/xingchen_2008/article/details/135313969
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_52124.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!