洪水_codevs3411_bfs

题目描述 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

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

数据范围及提示 Data Size & Hint

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

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

题解

看到洪水、水、可以流动的什么东西就要想到BoyFS了

每次搜索高度小于当前点的点,向四周扩展,略像滑雪(其实一点都不像)

之前用数组记录队列中的状态然后MLE了

猛然发现可以用c++自带的queue头文件,就这么用了

内存一直下不来,不知该如何解决

code

/*
作者:olahiuj
题目:p3411 洪水
*/
#include <stdio.h>
#include <cstring>
#include <queue>

using namespace std;

struct pos
{
    int x,y;
};

bool f[1001][1001];
int map[1001][1001];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

queue<pos>s;
pos st;

int n,m;

int main()
{
    memset(map,0,sizeof(map));
    memset(f,false,sizeof(f));

    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            scanf("%d",&map[i][j]);
    scanf("%d%d",&st.x,&st.y);

    s.push(st);
    f[st.x][st.y]=true;

    pos v;
    while (s.size())
    {
        pos now=s.front();
        int t=map[now.x][now.y];
        for (int i=0;i<4;i++)
        {
            int x=now.x+dx[i];
            int y=now.y+dy[i];

            if (x<=n&&x>0&&y<=m&&y>0&&map[x][y]<=t&&!f[x][y])
            {
                v.x=x;
                v.y=y;
                f[x][y]=true;
                s.push(v);
            }
        }
        s.pop();
    }
    int ans=0;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            if (!f[i][j])
                ans++;
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/olahiuj/p/5781233.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值