Foj 1408 位图

Accept: 327Submit: 1431
Time Limit: 1000 mSecMemory Limit : 32768 KB

Problem Description

现在我们给出一个n*m的黑白位图,n为行数,m为列数,且该位图中至少含有一个白色的像素。我们用(i,j)来表示第i行第j列的像素,并且定义两像素点p1=(i1,j1)和p2=(i2,j2)之间的距离为:d(p1,p2)=|i1-i2|+|j1-j2|。

对于任意给定的位图,计算出位图中每个像素到与它最近的白色像素之间的距离。

Input

本题有多组输入数据,每组数据第一行包含两个整数n,m,用空格分开,1<=n,m<=182。之后的n行每行包含一个长度为m的由0和1组成的字符串,即第i行第j个字符如果为"1",那么表示像素(i,j)为白的,否则为黑的。

Output

对于每组数据,输出包含n行,第i行的第j个数字为f(i,j),表示像素(i,j)到最近的白色像素的距离。每行内的数字用空格分开。

Sample Input

3 4
0001
0011
0110

Sample Output

3 2 1 0
2 1 0 0
1 0 0 1
这种搜索的题目总是做不好,...
杯具啊!!!
自己知道思路BSF,
可就是写不到AC....
以下是网上看的别人的代码:
#include <iostream> #include <queue> using namespace std; #define X 200 #define Y 200 struct Point_Struct { int x; int y; int flag; }; int BitMap[X+2][Y+2]; void BFS(int x,int y) { queue<Point_Struct> Queue; Point_Struct Temp_Point,Temp_Point2; int plusX[] = {0,1,0,-1}; int plusY[] = {1,0,-1,0}; int i; Temp_Point.x = x; Temp_Point.y = y; Temp_Point.flag = 0; Queue.push(Temp_Point); while(!Queue.empty()) { Temp_Point = Queue.front(); for(i=0;i<4;i++) { if(BitMap[Temp_Point.x+plusX[i]][Temp_Point.y+plusY[i]]==-1 || BitMap[Temp_Point.x+plusX[i]][Temp_Point.y+plusY[i]]>Temp_Point.flag+1) { BitMap[Temp_Point.x+plusX[i]][Temp_Point.y+plusY[i]] = Temp_Point.flag+1; Temp_Point2.x = Temp_Point.x+plusX[i]; Temp_Point2.y = Temp_Point.y+plusY[i]; Temp_Point2.flag = Temp_Point.flag+1; Queue.push(Temp_Point2); } } Queue.pop(); } } int main() { int x,y; int i,j; char str[Y+1]; while (scanf("%d%d", &x,&y)!=EOF) { memset(BitMap, 0, sizeof(BitMap)); for(i=0;i<=y+1;i++) { BitMap[0][i] = -2; BitMap[x+1][i] = -2; } for(i=0;i<=x+1;i++) { BitMap[i][0] = -2; BitMap[i][y+1] = -2; } for(i=1;i<=x;i++) { scanf("%s", str); for(j=1;j<=y;j++) BitMap[i][j] = str[j-1]-'0'-1; } for(i=1;i<=x;i++) { for(j=1;j<=y;j++) if(BitMap[i][j] == 0) BFS(i,j); } for(i=1;i<=x;i++) { for(j=1;j<y;j++) printf("%d ", BitMap[i][j]); printf("%d/n",BitMap[i][j]); } } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值