acwing 173. 矩阵距离(bfs)

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

dist(A[i][j],A[k][l])=|ik|+|jl|dist(A[i][j],A[k][l])=|i−k|+|j−l|

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

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

输入格式

第一行两个整数n,m。

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

输出格式

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

数据范围

1N,M10001≤N,M≤1000

输入样例:

3 4
0001
0011
0110

输出样例:

3 2 1 0
2 1 0 0
1 0 0 1
题意理解:B[i]对应原A[i]中为0的点到最近的为1的点的曼哈顿距离。
思路:bfs,将原来地图中为1的点全部先入队,然后展开广搜,碰到不为1的点就入队,并且标记它的最近曼哈顿距离为基点(从队列中取出来的点)的距离加1.因为刚开始将所有的地图上为1的点标记为1,所以最后输出时要减1.
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
int vis[1005][1005];
char g[1005][1005];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int n,m;
queue<P>q;
void bfs()
{
    while(q.size())
    {
        P st=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            int x=st.first+dx[i],y=st.second+dy[i];
            if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y])
            {
                vis[x][y]=vis[st.first][st.second]+1;
                q.push({x,y});
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        getchar();
        for(int j=0;j<m;j++)
        {
            scanf("%c",&g[i][j]);
            vis[i][j]=g[i][j]-'0';
            if(vis[i][j])
            q.push({i,j});
        }
    }
    bfs();
     for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            printf("%d ",vis[i][j]-1);
        }
        printf("\n");
    }
    return 0;
    
}
原文地址:https://www.cnblogs.com/chuliyou/p/12691648.html