描述
给定一个01矩阵。求距离每个点最近的“1”点。
思路
从1点开始bfs。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 1001
int dot[MAX][MAX];
int d[MAX][MAX];
int n,m;
pair<int,int> Q[MAX*MAX];
int top,bot;
void insert(int x,int y){Q[bot].first=x;Q[bot].second=y;bot++;}
int getx(){return Q[top].first;}
int gety(){return Q[top].second;}
void pop(){top++;}
bool empty(){return top>=bot;}
void bfs()
{
top=bot=0;
int x,y;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
if (dot[i][j])
insert(i,j),d[i][j]=0;
while (!empty())
{
x=getx();
y=gety();
if (x>0 && d[x-1][y]>d[x][y]+1)
{
d[x-1][y]=d[x][y]+1;
insert(x-1,y);
}
if (x<n-1 && d[x+1][y]>d[x][y]+1)
{
d[x+1][y]=d[x][y]+1;
insert(x+1,y);
}
if (y>0 && d[x][y-1]>d[x][y]+1)
{
d[x][y-1]=d[x][y]+1;
insert(x,y-1);
}
if (y<m-1 && d[x][y+1]>d[x][y]+1)
{
d[x][y+1]=d[x][y]+1;
insert(x,y+1);
}
pop();
}
}
int main()
{
memset(d,0x3f,sizeof(d));
char ini[MAX];
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
{
scanf("%s",ini);
for (int j=0;j<m;j++)
dot[i][j]=ini[j]-'0';
}
bfs();
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
printf("%d",d[i][j]);
if (j==m-1)printf("\n");
else printf(" ");
}
}
return 0;
}
感谢耒阳大视野教育培训机构: http://61.187.179.132/JudgeOnline/problem.php?id=2252