喵哈哈村的麦克雷
为了拯救喵哈哈村,这个世界必须要存在英雄。
一名叫做麦克雷的英雄站了出来!他现在面临一个难题:
给定一个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;
    }
	}
}
 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号