【BFS】bzoj2252 [2010Beijing wc]矩阵距离

要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止。

 

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 const int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
 6 struct Point{int x,y;Point(const int &a,const int &b){x=a;y=b;}Point(){}};
 7 queue<Point>q;
 8 int n,m,d[1000][1000],num;
 9 char s[1000][1000],CH[20];
10 inline void putint(int x)
11 {
12     num=0;  
13     while(x>0){CH[++num]=x%10;x/=10;}
14     while(num)putchar(CH[num--]+48);
15     putchar(' ');
16 }
17 int main()
18 {
19     scanf("%d%d",&n,&m);
20     memset(d,0x7f,sizeof(d));
21     for(int i=0;i<n;i++)
22       {
23           scanf("%s",s[i]);
24           for(int j=0;j<m;j++)
25             if(s[i][j]=='1')
26               {
27                 d[i][j]=0;
28                 q.push(Point(i,j));
29               }
30       }
31     while(!q.empty())
32       {
33           for(int i=0;i<4;i++)
34             {
35                 int tx=dx[i]+q.front().x,ty=dy[i]+q.front().y;
36                 if(tx>=0&&tx<n&&ty>=0&&ty<m&&d[q.front().x][q.front().y]+1<d[tx][ty])
37                   {
38                       q.push(Point(tx,ty));
39                       d[tx][ty]=d[q.front().x][q.front().y]+1;
40                   }
41             }
42           q.pop();
43       }
44     for(int i=0;i<n;i++)
45       {
46           for(int j=0;j<m;j++)
47             if(d[i][j])putint(d[i][j]);
48             else {putchar('0');putchar(' ');}
49           putchar('\n');
50       }
51     return 0;
52 }

 

posted @ 2014-09-08 18:38  AutSky_JadeK  阅读(283)  评论(1编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト