Bzoj 2252: [2010Beijing wc]矩阵距离 广搜

2252: [2010Beijing wc]矩阵距离 

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 563  Solved: 274
[Submit][Status][Discuss]

Description

 

假设我们有矩阵,其元素值非零即1

a11…… a1m

…………….

an1…….anm

 

定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L) 

Input

输入文件的第一行为两个整数,分别代表n和m。 
接下来的n行,第i行的第 j个字符代表aij

Output

输出包含N行,每行M个用空格分开的数字,其中第i行第J个数字代表
Min(D(aij,axy) 1<=x<=N 1<=y<m,且axy=1

Sample Input

3 4
0001
0011
0110

Sample Output

3 2 1 0
2 1 0 0
1 0 0 1

HINT

 

对于100%的数据,满足 0 <  m n <=1000

 

Source

 
题解:
广搜。
从1开始搜即可。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 1010
 4 #define INF 1e9
 5 int fx[6]={0,0,1,-1};
 6 int fy[6]={1,-1,0,0};
 7 int dis[MAXN][MAXN],a[MAXN][MAXN],qx[MAXN*MAXN],qy[MAXN*MAXN];
 8 char s[MAXN][MAXN];
 9 bool vis[MAXN][MAXN];
10 int main()
11 {
12     int n,m,i,j,wzx,wzy,head,tail,ux,uy,vx,vy;
13     scanf("%d %d",&n,&m);
14     for(i=1;i<=n;i++)scanf("\n%s",s[i]+1);
15     wzx=0;wzy=0;
16     memset(dis,0,sizeof(dis));
17     head=0;tail=0;memset(vis,false,sizeof(vis));
18     for(i=1;i<=n;i++)
19     {
20         for(j=1;j<=m;j++){dis[i][j]=INF;a[i][j]=s[i][j]-'0';if(a[i][j]==1){wzx=i,wzy=j;qx[++tail]=i;qy[tail]=j;vis[i][j]=true;dis[i][j]=0;}}
21     }
22     //memset(qx,0,sizeof(qx));
23     //memset(qy,0,sizeof(qy));
24     //memset(vis,false,sizeof(vis));
25     //vis[wzx][wzy]=true;
26     //head=0;tail=1;qx[tail]=wzx;qy[tail]=wzy;
27     //dis[wzx][wzy]=0;
28     while(head!=tail)
29     {
30         head++;if(head==1000010)head=0;
31         ux=qx[head];
32         uy=qy[head];
33         for(i=0;i<=3;i++)
34         {
35             vx=ux+fx[i];
36             vy=uy+fy[i];
37             if(vx>=1&&vx<=n&&vy>=1&&vy<=m&&vis[vx][vy]==false)
38             {
39                 if(dis[vx][vy]>dis[ux][uy]+1)
40                 {
41                     vis[vx][vy]=true;
42                     dis[vx][vy]=dis[ux][uy]+1;
43                     tail++;if(tail==1000010)tail=0;
44                     qx[tail]=vx;
45                     qy[tail]=vy;
46                 }
47                 if(a[vx][vy]==1){dis[vx][vy]=0;vis[vx][vy]=true;}
48             }
49         }
50         vis[ux][uy]=false;
51     }
52     for(i=1;i<=n;i++)
53     {
54         for(j=1;j<=m;j++)printf("%d ",dis[i][j]);
55         printf("\n");
56     }
57     fclose(stdin);
58     fclose(stdout);
59     return 0;
60 }

 

posted @ 2016-03-24 23:57  微弱的世界  阅读(279)  评论(0编辑  收藏  举报