SDOI 2005 毒瘤 位图
#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
更多精彩

