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

           }

       }

      

    }

}

原文地址:https://www.cnblogs.com/c1299401227/p/5370783.html