acwing 173. 矩阵距离(bfs)
给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为:
dist(A[i][j],A[k][l])=|i−k|+|j−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])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≤10001≤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; }