题目:173. 矩阵距离
题目描述
给定一个 N N N 行 M M M 列的 01 01 01 矩阵 A A A, A [ i ] [ j ] A[i][j] A[i][j] 与 A [ k ] [ l ] A[k][l] A[k][l] 之间的曼哈顿距离定义为:
d i s t ( i , j , k , l ) = ∣ i − k ∣ + ∣ j − l ∣ dist(i,j,k,l)=|i−k|+|j−l| dist(i,j,k,l)=∣i−k∣+∣j−l∣
输出一个 N N N 行 M M M 列的整数矩阵 B B B,其中:
B [ i ] [ j ] = m i n 1 ≤ x ≤ N , 1 ≤ y ≤ M , A [ x ] [ y ] = 1 d i s t ( i , j , x , y ) B[i][j]=min_{1≤x≤N,1≤y≤M,A[x][y]=1}dist(i,j,x,y) B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=1dist(i,j,x,y)
输入格式
第一行两个整数 N N N, M M M。
接下来一个 N N N 行 M M M 列的 01 01 01 矩阵,数字之间没有空格。
输出格式
一个 N N N 行 M M M 列的矩阵 B B B,相邻两个整数之间用一个空格隔开。
数据范围
1 ≤ N , M ≤ 1000 1≤N,M≤1000 1≤N,M≤1000
时空限制
1s / 64MB
输入样例
3 4
0001
0011
0110
输出样例
3 2 1 0
2 1 0 0
1 0 0 1
代码
#include<iostream>
#include<cstring>
using namespace std;
typedef pair<int, int> PII;
const int Maxn = 1000 + 10, Maxm = 1000 + 10;
int n, m, hh, tt = -1, dist[Maxn][Maxm];
char g[Maxn][Maxm];
PII q[Maxn * Maxm];
void bfs(){
memset(dist, -1, sizeof dist);
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};
}
}
}
while(hh <= tt){
auto t = q[hh ++];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
for(int i = 0; i < 4; i ++){
int x = t.first + dx[i], y = t.second + dy[i];
if(x < 0 || x >= n || y < 0 || y >= m){
continue;
}
if(dist[x][y] != -1){
continue;
}
q[++ tt] = {x, y};
dist[x][y] = dist[t.first][t.second] + 1;
}
}
}
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;
}