给定一个 N 行 M 列的 01 矩阵 A,A[i][j]与 A[k][l]之间的曼哈顿距离定义为:
dist(A[i][j],A[k][l])=|i−k|+|j−l|
输出一个 N 行 M 列的整数矩阵 BB,其中:
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
【思路及代码】
*多源BFS问题,主要在找到BFS的起点,将所有的起点放入到队列当中,再开始搜索。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
char a[N][N];
bool st[N][N];
int n,m,dist[N][N];
int d[5]={-1,0,1,0,-1};
void bfs()
{
queue<PII> q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='1')
{
q.push({i,j});
dist[i][j]=0;
st[i][j]=1;
}
}
}
while(q.size())
{
PII t=q.front();
q.pop();
int x1=t.first,y1=t.second;
for(int i=0;i<4;i++)
{
int xx=x1+d[i],yy=y1+d[i+1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&st[xx][yy]==0)
{
st[xx][yy]=true;
dist[xx][yy]=min(dist[x1][y1]+1,dist[xx][yy]);
q.push({xx,yy});
}
}
}
}
int main()
{
memset(dist,0x3f,sizeof dist);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
bfs();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<dist[i][j]<<" ";
cout<<endl;
}
return 0;
}