#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>

using namespace std;
int m,n;
int pho[200][200];
int f[200][200];
int vis[200][200],looked;
struct t{
	int x,y,cost;
};
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
queue <t> q; 
void bfs()
{
	memset(f,0x3f,sizeof(f));
	//int i;
	t p;
	while(!q.empty())
	{
		p=q.front();
		q.pop();
		int x=p.x;
		int y=p.y;
		vis[x][y]++;
		int cost=p.cost;
		if(vis[x][y]>=looked*2) continue;
		if(f[x][y]<cost)	continue;
		f[x][y]=cost;
		for(int i=0;i<=3;i++)
		{
			if(x+dx[i]<=n&&x+dx[i]>=1&&y+dy[i]<=m&&y+dy[i]>=1)
			{
			t a;
			a.x=x+dx[i];
			a.y=y+dy[i];
			a.cost=cost+1;
			q.push(a);
			} 
		 } 
	}
	return ;
}
int main()
{
	scanf("%d %d",&n,&m);
	int i,j;
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
	{
	scanf("%d",&pho[i][j]);
	t b;
	b.x=i;
	b.y=j;
	b.cost=0;
	if(pho[i][j]==1)
	{
		looked++;
		q.push(b);
	}
	}
	bfs();
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
	{
		printf("%d ",f[i][j]);
	}	
	printf("\n");
	}
	return 0;
}

  一遍过,没什么注意的,理论上每个点最多被刷新白点个数个次数,为了保险弄了个*2

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。