给定一个 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
解析:
将 “1” 点放入队列,再遍历即可。不过要注意输入的问题,要用字符数组输入。
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
- typedef pair<int,int> PII;
- const int N=2e6+10;
- char g[1010][1010];
- int d[1010][1010];
- bool vis[1010][1010];
- int dx[4]={-1,1,0,0};
- int dy[4]={0,0,-1,1};
- int n,m;
- queue <PII> q;
- void bfs()
- {
- for (int i=0;i<n;i++)
- for (int j=0;j<m;j++)
- {
- if (g[i][j]=='1')
- {
- q.push({i,j});
- vis[i][j]=1;
- }
- }
- while (q.size())
- {
- int x=q.front().first;
- int y=q.front().second;
- q.pop();
- for (int i=0;i<4;i++)
- {
- int a=x+dx[i],b=y+dy[i];
- if (a>=0&&a<n&&b>=0&&b<m&&!vis[a][b])
- {
- d[a][b]=d[x][y]+1;
- q.push({a,b});
- vis[a][b]=1;
- }
- }
- }
- }
- signed main()
- {
- ios;
- 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<<d[i][j]<<" ";
- cout<<endl;
- }
- return 0;
- }