173. 矩阵距离(多源点的最短路径问题)

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

dist(A[i][j],A[k][l])=|i−k|+|j−l|
输出一个N行M列的整数矩阵B,其中:

B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=1dist(A[i][j],A[x][y])
输入格式
第一行两个整数n,m。

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

输出格式
一个N行M列的矩阵B,相邻两个整数之间用一个空格隔开。

数据范围
1≤N,M≤1000
输入样例:

3 4
0001
0011
0110

输出样例:

3 2 1 0
2 1 0 0
1 0 0 1

代码

#include <iostream>
#include<cstring>
#include<queue>
using namespace std;

int n,m,dx[5]={-1,0,1,0},dy[5]={0,1,0,-1};//上右下左四个点的偏移量
char A[1005][1005];
int B[1005][1005];

void bfs(){
    memset(B,-1,sizeof B);//初始化B矩阵为-1,代表所有点均未被访问
    queue<pair<int,int> > q;//定义队列实现广搜
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(A[i][j]=='1'){//矩阵A中所有为1的点为起点
                q.push({i,j});//将其下标压入队列
                该点离某起点的最短距离为0(自己就是起点之一)
                B[i][j]=0;//,标志该点已被访问
            }
        }
    }//队列中的点离某起点(A矩阵中值为1的点)的最短距离是单调递增
    while(q.size()){
        auto f = q.front();//取出队头
        q.pop();//弹出队头
        int x = f.first;//获取队头横坐标
        int y = f.second;//获取队头纵坐标
        for(int i=0;i<4;i++){//遍历队头直接连接的四个方向的点
            int a = x + dx[i];//获得其坐标
            int b = y + dy[i];
            if(a>=0&&a<n&&b>=0&&b<m&&B[a][b]==-1){//该点未越界且未访问过
                //该点离某个起点的最短距离等于队头元素离起点的最短距离+1
                B[a][b]=B[x][y]+1;
                q.push({a,b});//将该点下标压入队列
            }
        }
    }
}

int main()
{
    cin >> n>> m;
    for(int i=0;i<n;i++)//因为是01字符串所以可以一次输1行
        cin>>A[i];
    //广搜:多源点最短路径问题,也可以把他看作单源点最短路径问题,引入一个虚拟结点
    bfs();//虚拟结点到各个起点的距离为0
    for(int i=0;i<n;i++){//输出其结果
        for(int j=0;j<m;j++){
            cout<<B[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目录 一.数论.... 4 1.阶乘最后非零位 ...... 4 2. 模线性方程(组) ..... 4 3. 素数表.. 6 4. 素数随机判定(miller_rabin) .. 6 5. 质因数分解 .. 7 6. 最大公约数欧拉函数 ... 8 二.图论_匹配 . 9 1. 二分图最大匹配(hungary 邻接表形式) ..... 9 2. 二分图最大匹配(hungary 邻接表形式,邻接阵接口) ...... 10 3. 二分图最大匹配(hungary 邻接阵形式) ... 10 4. 二分图最大匹配(hungary 正向表形式) ... 11 5. 二分图最佳匹配(kuhn_munkras 邻接阵形式) .. 11 6. 一般图匹配(邻接表形式) . 12 7. 一般图匹配(邻接表形式,邻接阵接口) .... 13 8. 一般图匹配(邻接阵形式) . 14 9. 一般图匹配(正向表形式) . 15 三.图论_生成树 ... 16 1. 最小生成树(kruskal 邻接表形式) ..... 16 2. 最小生成树(kruskal 正向表形式) ..... 17 3. 最小生成树(prim+binary_heap 邻接表形式) ..... 19 4. 最小生成树(prim+binary_heap 正向表形式) ..... 20 5. 最小生成树(prim+mapped_heap 邻接表形式) .. 21 6. 最小生成树(prim+mapped_heap 正向表形式) .. 22 7. 最小生成树(prim 邻接阵形式)... 23 8. 最小树形图(邻接阵形式) . 24 四.图论_网络流 ... 25 1. 上下界最大流(邻接表形式) 25 2. 上下界最大流(邻接阵形式) 26 3. 上下界最小流(邻接表形式) 27 4. 上下界最小流(邻接阵形式) 29 5. 最大流(邻接表形式) .. 30 6. 最大流(邻接表形式,邻接阵接口) ..... 31 7. 最大流(邻接阵形式) .. 32 8. 最大流无流量(邻接阵形式) 32 9. 最小费用最大流(邻接阵形式) ... 33 五. 图论_最路径 34 1. 最路径(单bellman_ford 邻接阵形式) . 34 2. 最路径(单dijkstra_bfs 邻接表形式) 35 3. 最路径(单dijkstra_bfs 正向表形式) 35 4. 最路径(单dijkstra+binary_heap 邻接表形式) .. 36 2 5. 最路径(单dijkstra+binary_heap 正向表形式) .. 37 6. 最路径(单dijkstra+mapped_heap 邻接表形式) 38 7. 最路径(单dijkstra+mapped_heap 正向表形式) 39 8. 最路径(单dijkstra 邻接阵形式) 40 9. 最路径(多floyd_warshall 邻接阵形式) ..... 40 六. 图论_连通性 .... 41 1. 无向图关键边(dfs 邻接阵形式) . 41 2. 无向图关键点(dfs 邻接阵形式) . 42 3. 无向图块(bfs 邻接阵形式) .. 43 4. 无向图连通分支(bfs 邻接阵形式) .... 43 5. 无向图连通分支(dfs 邻接阵形式) .... 44 6. 有向图强连通分支(bfs 邻接阵形式) 44 7. 有向图强连通分支(dfs 邻接阵形式) 45 8. 有向图最小点基(邻接阵形式) ... 46 七. 图论_应用 46 1.欧拉回路(邻接阵形式) 46 2. 前序表转化 47 3. 树的优化算法 ...... 48 4. 拓扑排序(邻接阵形式). .... 49 5. 最佳边割集 50 6. 最佳顶点割集 ...... 51 7. 最小边割集 52 8. 最小顶点割集 ...... 53 9. 最小路径覆盖 ...... 55 八. 图论_NP 搜索.. 55 1. 最大团(n 小于64)(faster).. 55 2. 最大团 58 九. 组合... 59 1. 排列组合生成 ...... 59 2. 生成gray 码 . 60 3. 置换(polya) 61 4. 字典序全排列 ...... 61 5. 字典序组合 62 6. 组合公式.... 62 十. 数值计算.. 63 1. 定积分计算(Romberg) ...... 63 2. 多项式求根(牛顿法) .. 64 3. 周期性方程(追赶法) .. 66 十一. 几何...... 67 1. 多边形 67 2. 多边形切割 70 3. 浮点函数.... 71 4. 几何公式.... 76 5. 面积.... 78 3 6. 球面.... 79 7. 三角形 79 8. 三维几何.... 81 9. 凸包(graham) 89 10. 网格(pick) 91 11. 圆 ...... 92 12. 整数函数.. 94 13. 注意.. 96 十二. 结构...... 97 1. 并查集 97 2. 并查集扩展(friend_enemy) .. 98 3. 堆(binary) ... 98 4. 堆(mapped) 99 5. 矩形切割.... 99 6. 线段树...... 100 7. 线段树扩展 . 102 8. 线段树应用 . 105 9. 子段和...... 105 10. 子阵和.... 105 十三. 其他.... 106 1. 分数.. 106 2. 矩阵.. 108 3. 日期.. 110 4. 线性方程组(gauss) ... 111 5. 线性相关.. 113 十四. 应用.... 114 1. joseph 114 2. N 皇后构造解 ..... 115 3. 布尔母函数 . 115 4. 第k 元素.. 116 5. 幻方构造.. 116 6. 模式匹配(kmp) .. 118 7. 逆序对数.. 118 8. 字符串最小表示 119 9. 最长公共单调子序列 ...... 119 10. 最长子序列 ...... 120 11. 最大子串匹配 .. 121 12. 最大子段和 ...... 122 13. 最大子阵和 ...... 123

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值