为了拯救喵哈哈村,这个世界必须要存在英雄。
一名叫做麦克雷的英雄站了出来!他现在面临一个难题:
给定一个N x M的01矩阵,其中1表示陆地,0表示水域。对于每一个位置,求出它距离最近的水域的距离是多少。
矩阵中每个位置与它上下左右相邻的格子距离为1。
本题包含若干组测试数据:
第一行包含两个整数,N和M。
以下N行每行M个0或者1,代表地图。
数据保证至少有1块水域。
满足,1 <= N, M <= 100
输出N行,每行M个空格分隔的整数。每个整数表示该位置距离最近的水域的距离。
每行的末尾都请加一个空格……
0 1 1 0 1 2 2 1 1 2 2 1 0 1 1 0
题解
#include<bits/stdc++.h>
using namespace std;
int n,m;
string s[805];
int mp[805][805];
int dx[4]{1,-1,0,0};
int dy[4]{0,0,1,-1};
main()
{
while(cin>>n>>m)
{
memset(mp,-1,sizeof(mp));
for(int i=0;i<n;i++)
cin>>s[i];
queue<int> QX,QY;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(s[i][j]=='0')
{
mp[i][j]=0;
QX.push(i);
QY.push(j);
}
}
while(!QX.empty()){
int nx = QX.front();
int ny = QY.front();
QX.pop();
QY.pop();
for(int i=0;i<4;i++){
int nex=nx+dx[i];
int ney=ny+dy[i];
if(nex<0||nex>=n)continue;
if(ney<0||ney>=m)continue;
if(mp[nex][ney]!=-1)continue;
mp[nex][ney]=mp[nx][ny]+1;
QX.push(nex);
QY.push(ney);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<mp[i][j]<<" ";
cout<<endl;
}
}
}