zoukankan      html  css  js  c++  java
  • 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("
    %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("
    ");
    56     }
    57     fclose(stdin);
    58     fclose(stdout);
    59     return 0;
    60 }
  • 相关阅读:
    [转]读取并修改App.config文件
    [转]线程和进程的概念
    实习日志(3)
    实习日志2
    实习小感,回学校啦~~~~
    请教LUA高手一段代码,希望帮忙谢谢!
    实习的日子
    vs显示 error LNK2019: 无法解析的外部符号 _main解决办法
    创建一个新窗口进程并返回进程ID号和进程的主线程ID号
    显示基本图形界面第一天
  • 原文地址:https://www.cnblogs.com/Var123/p/5317856.html
Copyright © 2011-2022 走看看