HOJ 位图[BFS]

位图
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 230, Accepted users: 201
Problem 10109 : No special judgement
Problem description
现在我们给出一个n×m的单色位图,且该为图中至少含有一个白色的像素。我们用(i, j)来代表第i行第j列的像素,并且定义两点p1=(i1, j1)和p2=(i2, j2)之间的距离为: d(p1, p2)=|i1 - i2| + |j1 - j2|
请写一个程序:
读入该位图;对于每个像素,计算出离该像素最近的白色像素与它的距离。

Input
第一行包括两个用空格分开的整数n和m,1<=n<=182,1<=m<=182。以下的n行每行包括一个长度为m的用0和1组成的字符串,在第i+1行的第j个字符如果为”1”,那么表示像素(i, j)为白的,否则为黑的。

Output
输出一个n×m的数表,其中的第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
Judge Tips
注意输出的f(i,j)数据,每两个之间为一个空格。
你可以在网站http://www.mimuw.edu.pl/~msawicki/stereo.html上找到一个叫做Stereogram的小程序,这就是该问题的原型。


Problem Source
SDOI

Submit   Discuss   Judge Status  Problems  Ranklist 

 

 

 

刚开始的时候一直想着用1来作为起点进行搜索,后来才改过来,BFS搜的就是最短距离。

code:

  1 /*
  2 3 2
  3 01
  4 00
  5 10
  6 1 0
  7 1 1
  8 0 1
  9 4 4
 10 1000
 11 0000
 12 0000
 13 0001
 14 0 1 2 3
 15 1 2 3 2
 16 2 3 2 1
 17 3 2 1 0
 18 5 5
 19 00000
 20 00000
 21 00100
 22 00000
 23 00000
 24 4 3 2 3 4
 25 3 2 1 2 3
 26 2 1 0 1 2
 27 3 2 1 2 3
 28 4 3 2 3 4
 29 5 5
 30 10001
 31 00000
 32 00100
 33 00000
 34 10001
 35 0 1 2 1 0
 36 1 2 1 2 1
 37 2 1 0 1 2
 38 1 2 1 2 1
 39 0 1 2 1 0
 40 */ 
 41 #include <iostream>   
 42 #include <iomanip>   
 43 #include <fstream>   
 44 #include <sstream>   
 45 #include <algorithm>   
 46 #include <string>   
 47 #include <set>   
 48 #include <utility>   
 49 #include <queue>   
 50 #include <stack>   
 51 #include <list>   
 52 #include <vector>   
 53 #include <cstdio>   
 54 #include <cstdlib>   
 55 #include <cstring>   
 56 #include <cmath>   
 57 #include <ctime>   
 58 #include <ctype.h> 
 59 using namespace std;
 60 
 61 int n,m; 
 62 int map[205][205];
 63 int res[205][205];
 64 int record[100205][2];
 65 int vst[205][205]; 
 66 int cnt;
 67 char str[1100];
 68 int dir[4][2]={
 69     0,1,
 70     0,-1,
 71     1,0,
 72     -1,0 
 73 };
 74 
 75 typedef struct node 
 76 {
 77     int x,y;
 78     int step;
 79 }Node;
 80 
 81 bool check(int x,int y)
 82 {
 83     if(x>=0&&x<n&&y>=0&&y<m&&!vst[x][y])
 84         return true;
 85     else
 86         return false;
 87 }
 88 
 89 void BFS(int sx,int sy)
 90 {
 91     int i;
 92     memset(vst,0,sizeof(vst));
 93     vst[sx][sy]=1;
 94     queue<Node>Que;
 95     Node pre,last;
 96     pre.x=sx;
 97     pre.y=sy;
 98     pre.step=0;
 99     Que.push(pre);
100     while(!Que.empty())
101     {
102         pre=Que.front();
103         Que.pop();
104         if(map[pre.x][pre.y]==1)
105         {
106             res[sx][sy]=pre.step;
107              return;
108         } 
109         for(i=0;i<4;i++)
110         {
111             last.x=pre.x+dir[i][0];
112             last.y=pre.y+dir[i][1];
113             last.step=pre.step+1;
114             if(check(last.x,last.y))
115             {
116                 Que.push(last);
117                 vst[last.x][last.y]=1;
118             }
119         }
120     }
121 }
122     
123 
124 int main()
125 {
126     int i,j;
127     while(~scanf("%d%d",&n,&m))
128     { 
129         cnt=0;
130         memset(map,0,sizeof(map));
131         memset(res,0,sizeof(res)); 
132         getchar();
133         for(i=0;i<n;i++)
134         {
135              for(j=0;j<m;j++)
136             {
137                  if(getchar()=='0')
138                  {
139                     map[i][j]=0;
140                      record[cnt][0]=i;
141                      record[cnt++][1]=j;
142                 } 
143                  else
144                     map[i][j]=1;
145               }
146             getchar();
147         }
148         for(i=0;i<cnt;i++)
149             BFS(record[i][0],record[i][1]);
150         for(i=0;i<n;i++)
151         {
152             for(j=0;j<m;j++)
153             {
154                 if(j==0)
155                    printf("%d",res[i][j]);
156                 else
157                    printf(" %d",res[i][j]);
158             }
159             printf("\n");
160         }  
161     } 
162     return 0;
163 }

 

posted @ 2012-07-21 16:23  max_xbw  阅读(293)  评论(0编辑  收藏  举报