zoukankan      html  css  js  c++  java
  • HihoCoder1478

    题意

    中文题。

    思路

    本来直接先把水域存起来,之后再for遍历,遇到陆地就用这个陆地去搜所有的水域,然后,TLE。

    正确的做法是 BFS ,我想到了但是我没写出来。我又以为是记忆化搜索。

    补充

    这里我用到pair,

    放上我之前写的pair的用法:https://www.cnblogs.com/OFSHK/p/11788576.html

    AC代码

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #include<cmath>
    #include<list>
    #include<stdlib.h>
    #include<map>
    #include<vector>
    #include<stack>
    #include<string.h>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    typedef long long ll;
    #define sc(T) scanf("%d",&T)
    #define scc(x,y) scanf("%d %d",&x,&y)
    #define pr(T) printf("%d
    ",T)
    #define f(a,b,c) for (int a=b;a<c;a++)
    #define ff(a,b,c) for (int a=b;a>c;a--)
    #define inf 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a))
    #define eps 1e-9
    #define PI acos(-1)
    
    const int N=805;
    char a[N][N];
    int n,m,ans[N][N],book[N][N];
    int to[4][2]= {{0,-1},{0,1},{-1,0},{1,0}};
    //struct node
    //{
    //    int x,y;
    //} w[160020];
    
    queue<pair<int,int> >Q;
    
    void bfs()
    {
        while(!Q.empty())
        {
            int x=Q.front().first,y=Q.front().second;
            Q.pop();
            for(int i=0; i<4; i++)
            {
                int tx=x+to[i][0],ty=y+to[i][1];
                if(tx>=1&&tx<=n&&ty>=0&&ty<=m&&book[tx][ty]==-1)
                    book[tx][ty]=book[x][y]+1,Q.push({tx,ty});
            }
        }
    }
    
    int main()
    {
        scc(n,m);
        int p=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%s",a[i]+1);
    //        for(int j=1; j<=m; j++)
    //        {
    //            if(a[i][j]=='0') //水域
    //                w[p].x=i,w[p++].y=j;
    //        }
        }
        mem(book,-1);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(a[i][j]=='0')
                    book[i][j]=0,Q.push({i,j});
            }
        }
        bfs();
    //    for(int i=1; i<=n; i++)
    //    {
    //        for(int j=1; j<=m; j++)
    //        {
    //            if(j==m)
    //                pr(ans[i][j]);
    //            else
    //                printf("%d ",ans[i][j]);
    //        }
    //    }
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
                printf("%d%c",book[i][j],j==m?'
    ':' ');
        }
        return 0;
    }
    
  • 相关阅读:
    sigpending
    js 动态计算折扣后总价格
    让ie6支持fixed最简单和实用的方法
    jquery提示气泡
    在线API,桌面版,jquery,css,Android中文开发文档,JScript,SQL掌用实例
    三元组表
    B-树
    二叉排序树
    顺序查找
    二分查找
  • 原文地址:https://www.cnblogs.com/OFSHK/p/13728034.html
Copyright © 2011-2022 走看看