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;//防止重复一个地点重复淹没

               }

           }

          

        }

    }

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290435.html
Copyright © 2011-2022 走看看