[2010Beijing wc]矩阵距离

来源:互联网 发布:井下电钳网络考试平台 编辑:程序博客网 时间:2024/06/14 00:20

描述

给定一个01矩阵。求距离每个点最近的“1”点。

思路

从1点开始bfs。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAX 1001int 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

原创粉丝点击