zoukankan      html  css  js  c++  java
  • bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252

    又没能自己想出来...

    一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不走了...

    然而实际上直接多源bfs,从所有1一起开始,因为只需要找到0碰到的第一个1即可;

    这样搜一遍就可以,复杂度很美。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int const maxn=1005;
    int n,m,a[maxn][maxn],b[maxn][maxn],dx[5]={1,0,-1,0},dy[5]={0,1,0,-1};
    bool vis[maxn][maxn];
    queue<pair<int,int> >q;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                scanf("%1d",&a[i][j]);
                if(a[i][j])q.push(make_pair(i,j)),vis[i][j]=1;
            }
        while(q.size())
        {
            int x=q.front().first,y=q.front().second; q.pop();
            for(int i=0;i<4;i++)
            {
                int tx=x+dx[i],ty=y+dy[i];
                if(vis[tx][ty]||tx<1||ty<1||tx>n||ty>m)continue;
                b[tx][ty]=b[x][y]+1; vis[tx][ty]=1;
                q.push(make_pair(tx,ty));
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                printf("%d ",b[i][j]);
            printf("
    ");
        }
        return 0;
    }    
  • 相关阅读:
    OCA读书笔记(11)
    shell命令--rev
    OCA读书笔记(10)
    shell命令--cut
    OCA读书笔记(9)
    shell命令--tail
    天气的研究
    网络知识汇总(2)
    shell命令--head
    OCM读书笔记(2)
  • 原文地址:https://www.cnblogs.com/Zinn/p/9382146.html
Copyright © 2011-2022 走看看