【CODE[VS]】3411--洪水

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34072526/article/details/87532555

题目描述 Description

小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质:
①露营地可以被看做是一个N*M的矩形方阵,其中左上角坐标为(1,1),右下角坐标为(n,m),每个格子(i,j)都有一个高度h(i,j)。
②洪水送(r,c)开始,如果一个格子被洪水淹没,那这个格子四周比它低(或相同)的格子也会被淹没。
现在松松想请你帮忙算算,有多少个格子不会被淹没,便于他和朋友逃脱。
【原有误数据已删除】

输入描述 Input Description

第一行包含两个整数n,m,表示矩形方阵右下角坐标。
以下n行,每行m个数,第i行第j个数表示格子(i,j)的高度。
最后一行包含两个整数r,c,表示最初被洪水淹没的格子。

输出描述 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 <cstdio>
#include <queue>
using namespace std;

const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
bool vis[1010][1010];
int matrix[1010][1010];
int n, m, r, c, res;

struct node{
    int x, y;
}f;

int bfs(){
    queue<node> q;
    f.x = r, f.y = c;
    q.push(f);
    int iBfs, jBfs;
    vis[f.x][f.y] = 1;
    while(!q.empty()){
        node b = q.front();
        q.pop();
        for(iBfs = 0; iBfs < 4; iBfs++){
            node d;
            d.x = b.x + dx[iBfs];
            d.y = b.y + dy[iBfs];
            if(d.x >= 1 && d.x <= n && d.y >= 1 && d.y <= m && !vis[d.x][d.y] && matrix[d.x][d.y] <= matrix[b.x][b.y]){
                vis[d.x][d.y] = 1;
                q.push(d);
            }
        }
    }
    for(iBfs = 1; iBfs <= n; iBfs++){
        for(jBfs = 1; jBfs <= m; jBfs++){
            if(!vis[iBfs][jBfs]) res++;
        }
    }
    return res;
}

int main(){
    int iMain, jMain;
    scanf("%d %d", &n, &m);
    for(iMain = 1; iMain <= n; iMain++){
        for(jMain = 1; jMain <= m; jMain++) scanf("%d", &matrix[iMain][jMain]);
    }
    scanf("%d %d", &r, &c);
    printf("%d", bfs());
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34072526/article/details/87532555