题目描述 给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为:
输出一个N行M列的整数矩阵B,其中:
输入格式 第一行两个整数n,m。
接下来一个N行M列的01矩阵,数字之间没有空格。
输出格式 一个N行M列的矩阵B,相邻两个整数之间用一个空格隔开。
数据范围
样例 输入样例: 3 4 0001 0011 0110 输出样例: 3 2 1 0 2 1 0 0 1 0 0 1
思路:多源bfs,其实多源和单源一样,没什么了不起的,预处理入队 (距离为0)即可
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
#define x first
#define y second
typedef pair<int,int> pii;
int n,m,dis[N][N];;
char g[N][N];
void bfs(){
queue<pii>q;
int nx[4]={-1,1,0,0},ny[4]={0,0,1,-1};
memset(dis,-1,sizeof dis);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(g[i][j]=='1'){
q.push({i,j});
dis[i][j]=0;
}
}
}
while(!q.empty()){
auto now=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=now.x+nx[i],b=now.y+ny[i];
if(a<0||b<0||a>n-1||b>m-1)continue;
if(dis[a][b]!=-1||g[a][b]=='1')continue;
dis[a][b]=dis[now.x][now.y]+1;
q.push({a,b});
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>g[i];
}
bfs();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<dis[i][j]<<' ';
}
puts("");
}
return 0;
}