zoukankan      html  css  js  c++  java
  • 40.广搜练习:洪水


     时间限制: 1 s

     空间限制: 64000 KB

     题目等级 : 青铜 Bronze

     查看运行结果

    题目描述 Description

    小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质:

    露营地可以被看做是一个N*M的矩形方阵,其中左上角坐标为(1,1),右下角坐标为(n,m),每个格子(i,j)都有一个高度h(i,j)

    洪水送(r,c)开始,如果一个格子被洪水淹没,那这个格子四周比它低(或相同)的格子也会被淹没。

    现在松松想请你帮忙算算,有多少个格子不会被淹没,便于他和朋友逃脱。

    【原有误数据已删除】

    输入描述 Input Description

    第一行包含两个整数nm,表示矩形方阵右下角坐标。

    以下n行,每行m个数,第i行第j个数表示格子(i,j)的高度。

    最后一行包含两个整数rc,表示最初被洪水淹没的格子。

    输出描述 Output Description

    输出仅一行,为永远不会被淹没的格子的数量。

    样例输入 Sample Input

    3 3

    1 2 3

    2 3 4

    3 4 5

    2 2

    样例输出 Sample Output

    5

    数据范围及提示 Data Size & Hint

    对于90%的数据,保证随机生成。

    对于100%的数据,1<=N,M<=1000

    代码:

    #include

    using namespace std;

    #include

    #include

    struct DL{

        long long x,y,high;

    };

    #define maxn 1001

    DL dl[maxn*maxn];//队列一定要开大一点,能放下所有的点

    int jz[maxn][maxn];

    int visit[maxn][maxn]={0};

    int xx[]={0,0,1,-1};

    int yy[]={1,-1,0,0};

    long long n,m,r,c;

    long long head=0,tail=0;

    void input();

    void BFS();

    int main()

    {

        input();

        BFS();

        printf("%lld",n*m-tail);//n*m是所有点,tail是被淹没的点的数目

        return 0;

    }

    void input()

    {

        scanf("%d%d",&n,&m);

        int t=0;

        for(int i=1;i<=n;++i)

          for(int j=1;j<=m;++j)

          {

            scanf("%d",&jz[i][j]);

          }

          scanf("%lld%lld",&r,&c);

    }

    void BFS()

    {

        head=0;

        tail=1;

        dl[tail].x=r;dl[tail].y=c;dl[tail].high=jz[r][c];

        visit[r][c]=1;

        while(head

        {

           head++;

           int x1=dl[head].x,y1=dl[head].y,h1=dl[head].high;

           for(int i=0;i<4;++i)

           {

               int x2=x1+xx[i],y2=y1+yy[i];

               if(x2>=1&&x2<=n&&y2>=1&&y2<=m&&jz[x2][y2]<=h1&&!visit[x2][y2])//比较高度

               {

                  ++tail;

                  dl[tail].x=x2;

                  dl[tail].y=y2;

                  dl[tail].high=jz[x2][y2];

                  visit[x2][y2]=1;//防止重复一个地点重复淹没

               }

           }

          

        }

    }

  • 相关阅读:
    时间戳计算
    .NET/C#/Oracle数据库操作类
    memcached安装及.NET中的Memcached.ClientLibrary使用
    C# Redis
    Jmeter教程 简单的压力测试
    Elasticsearch查询类型
    Windows 如何查看本地端口被进程占用的情况?
    Log4net 配置
    NLog 配置
    RPC原理
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290432.html
Copyright © 2011-2022 走看看