32. [POI1999] 位图
★ 输入文件:bit.in
输出文件:bit.out
简单对比
时间限制:1 s 内存限制:128 MB
【问题描述 】
给定一个 n*m 的矩形位图,位图中的每个像素不是白色就是黑色,但至少有一个是白色的。第 i 行、第 j 列的像素被称作像素 (i, j) 。两个像素 p1 = (i1, j1) , p2 = (i2, j2) 之间的距离定义为: d(p1, p2) = |i1 - i2| + |j1 - j2|.
【任务 】
编一个程序完成以下操作:
1 .从输入文件中读入此位图的有关信息。
2 .对于每个像素,计算此像素与离其最近的“白像素”的距离。
3 .将结果写到输出文件里面。
【输入格式 】
输入文件的第一行包含两个整数 n, m ( 1 ≤ n ≤ 182, 1 ≤ m ≤ 182 ),用一个空格隔开。接下来 n 行,每一行都包含一个长度为 m 的 01 串;第 i+1 行,第 j 列的字符若为 1 ,则像素 (i, j) 是白色的;否则是黑色的。
【输出格式 】
输出文件包含 n 行 , 每行有 m 个用空格隔开的整数。第 i 行、第 j 列的整数表示 (i, j) 与离它最近的白像素之间的距离
【样例输入】
bit.in
3 4
0001
0011
0110
【样例输出】
bit.out
3 2 1 0
2 1 0 0
1 0 0 1
思路:宽搜可过。
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int a[200][200]; int dx[5]={0,1,0,-1}; int dy[5]={1,0,-1,0}; queue<int>que,pue; void bfs(){ while(!que.empty()){ int x=que.front(),y=pue.front(); que.pop(); pue.pop(); for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!=0 ){ if(a[xx][yy]==-1){ a[xx][yy]=a[x][y]+1; que.push(xx); pue.push(yy); } else{ if(a[xx][yy]>a[x][y]+1){ a[xx][yy]=a[x][y]+1; que.push(xx); pue.push(yy); } } } /*cout<<"******************************"<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) printf("%d ",a[i][j]); printf("\n"); } cout<<"*******************************"<<endl;*/ } } } int main(){ freopen("bit.in","r",stdin); freopen("bit.out","w",stdout); scanf("%d%d",&n,&m); memset(a,-1,sizeof(a)); for(int i=1;i<=n;i++){ char s[200]; scanf("%s",s+1); for(int j=1;j<=m;j++){ if(s[j]=='1'){ a[i][j]=0; que.push(i); pue.push(j); } } } bfs(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) printf("%d ",a[i][j]); printf("\n"); } }