173. 矩阵距离 acwing -多路BFS

原题链接:173. 矩阵距离 - AcWing题库

给定一个 N行 M 列的 01矩阵 A,A[i][j] 与 A[k][l]]之间的曼哈顿距离定义为:

dist(i,j,k,l)=|i−k|+|j−l||

输出一个 N 行 M 列的整数矩阵 B,其中:

B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=1dist(i,j,x,y)

输入格式

第一行两个整数 N,M

接下来一个 N 行 M 列的 01 矩阵,数字之间没有空格。

输出格式

一个 NN 行 MM 列的矩阵 B,相邻两个整数之间用一个空格隔开。

数据范围

1≤N,M≤1000

输入样例:
复制代码
3 4
0001
0011
0110
输出样例:
复制代码
3 2 1 0
2 1 0 0
1 0 0 1
cpp 复制代码
#include<iostream>
#include<algorithm>
#include<cstring>

// 定义宏,方便使用pair的first和second成员
#define x first
#define y second

using namespace std;

// 定义一个pair<int, int>类型的别名PII
typedef pair<int,int> PII;

// 定义常量N和M,N表示网格的最大行数,M表示队列的最大大小
const int N = 1010, M = N*N;

// 定义全局变量n和m,分别表示网格的行数和列数
int n, m;

// 定义一个二维字符数组g,用于存储网格中的字符
char g[N][N];

// 定义一个队列q,用于广度优先搜索
PII q[M];

// 定义一个二维整数数组dist,用于存储每个位置到最近的'1'的距离
int dist[N][N];

// 定义广度优先搜索函数bfs
void bfs()
{
    // 初始化dist数组,所有位置的距离设为-1
    memset(dist, -1, sizeof dist);
    
    // 定义队列的头指针hh和尾指针tt
    int hh = 0, tt = -1;
    
    // 遍历整个网格,将所有值为'1'的位置加入队列,并将它们的距离设为0
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (g[i][j] == '1')
            {
                dist[i][j] = 0;
                q[++tt] = {i, j};
            }
        }
    }
    
    // 定义四个方向的移动数组dx和dy
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    
    // 开始广度优先搜索
    while (hh <= tt)
    {
        // 取出队列头部元素
        auto 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 (dist[a][b] != -1) continue;
            
            // 更新新位置的距离,并将其加入队列
            dist[a][b] = dist[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();
    
    // 输出每个位置到最近的'1'的距离
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%d ", dist[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}
相关推荐
vlln1 分钟前
适应性神经树:当深度学习遇上决策树的“生长法则”
人工智能·深度学习·算法·决策树·机器学习
冲帕Chompa1 小时前
图论part09dijkstra算法
算法·图论
·云扬·1 小时前
【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
redis·算法·lua
周Echo周1 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
zkmall1 小时前
推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略
算法·机器学习·推荐算法
矿渣渣2 小时前
AFFS2 的 `yaffs_ext_tags` 数据结构详解
数据结构·算法·文件系统·yaffs2
workflower2 小时前
使用谱聚类将相似度矩阵分为2类
人工智能·深度学习·算法·机器学习·设计模式·软件工程·软件需求
HappyAcmen2 小时前
线代第二章矩阵第八节逆矩阵、解矩阵方程
笔记·学习·线性代数·矩阵
cwywsx2 小时前
Linux:进程控制2
linux·运维·算法
真的想上岸啊2 小时前
c语言第一个小游戏:贪吃蛇小游戏06
c语言·算法·链表