AcWing算法提高课-2.3.1矩阵距离

算法提高课整理

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 1\le n,m\le 1000 1≤n,m≤1000


思路

先考虑从 0 的位置向外扩展。

发现这样的话较麻烦,于是改为考虑从 1 的位置用 BFS 向外扩展,并处理出所有的距离。

这种算法即为 "多源 BFS"。具体算法流程为:将所有源点都入队,然后正常跑 BFS。

具体细节见代码。

算法时间复杂度
AC Code

C + + \text{C}++ C++

cpp 复制代码
#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;
}

最后,如果觉得对您有帮助的话,点个赞再走吧!

相关推荐
gis开发之家8 分钟前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码
进击的丸子13 分钟前
虹软人脸服务器SDK-C++语言Demo实操指南
后端·算法
十五年专注C++开发21 分钟前
C++设计一个函数来求容器元素绝对值之和的平均值
c++·模板·accumulate
兰令水33 分钟前
hot100【acm版】【2026.7.25/26打卡-java版本】
java·算法·排序算法
音视频工程实战1 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
wabs6662 小时前
关于图论【卡码网104.建造最大岛屿的思考】
数据结构·算法·图论
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练:【排序算法】案例9:成绩排序
c++·排序算法·csp·高频考点·信奥赛·成绩排序
玖玥拾2 小时前
LeetCode 27 移除元素
算法·leetcode
程序喵大人2 小时前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-15 计算圆周率(C语言实现)
c语言·开发语言·数据结构·算法