炒鸡简单的BFS,
把白色的先入队列,然后慢慢往外扩。
BFS保证第一次触到一个点时,总是距离最近的。
#include<iostream>
using namespace std;
int n,m;
struct node
{
int x;
int y;
int color;
int dis;
} phonex[151][151];
node que[22501];
int head=1,tail=1;
void push(node a)//给队列加入一个元素
{
que[tail]=a;
tail++;
return;
}
node pop()//弹出队列第一个元素
{
head++;
return que[head-1];
}
bool empty()
{
if(head==tail)
return true;
return false;
}
void bfs()
{
node first;
while(!empty())
{
first=pop();
if(first.x!=1 && phonex[first.x-1][first.y].color==0 &&
phonex[first.x-1][first.y].dis==0)
{
phonex[first.x-1][first.y].dis=first.dis+1;
push(phonex[first.x-1][first.y]);
}
if(first.x!=n && phonex[first.x+1][first.y].color==0 &&
phonex[first.x+1][first.y].dis==0)
{
phonex[first.x+1][first.y].dis=first.dis+1;
push(phonex[first.x+1][first.y]);
}
if(first.y!=1 && phonex[first.x][first.y-1].color==0 &&
phonex[first.x][first.y-1].dis==0)
{
phonex[first.x][first.y-1].dis=first.dis+1;
push(phonex[first.x][first.y-1]);
}
if(first.y!=m && phonex[first.x][first.y+1].color==0 &&
phonex[first.x][first.y+1].dis==0)
{
phonex[first.x][first.y+1].dis=first.dis+1;
push(phonex[first.x][first.y+1]);
}//广度优先
}
return;
}
void read()
{
int i,j;
cin>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
cin>>phonex[i][j].color;
phonex[i][j].x=i;
phonex[i][j].y=j;
phonex[i][j].dis=0;
if(phonex[i][j].color==1)
push(phonex[i][j]);
}
bfs();
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
cout<<phonex[i][j].dis<<" ";
cout<<endl;
}
return;
}
int main()
{
read();
return 0;
}
//像素那个词忘了怎么拼。。
AC掉的。