水 water 积水问题 蓄水问题

水(water )

【题目描述】
    有一块矩形土地被划分成 n×m 个正方形小块。这些小块高低不平,每一小块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中。
    一场大雨后,由于地势高低不同,许多地方都积存了不少降水。假如你已经知道这块土地的详细信息,你能求出每个小块的积水高度吗?
    注意:假设矩形地外围的高度为 0。
【输入格式】
    第一行包含两个非负整数 n,m。
    接下来 n 行每行 m个整数表示第 i 行第 j 列的小块的高度。
【输出格式】
    输出 n 行,每行 m个由空格隔开的非负整数,表示每个小块的积水高度。
【样例输入】
3 3
4 4 0
2 1 3
3 3 -1
【样例输出】
0 0 0
0 1 0
0 0 1
【数据范围】
    对于 20%的数据 n,m<=4
    对于 40%的数据 n,m<=15
    对于 60%的数据 n,m<=50
    对于 100%的数据 n,m<=300 小块高度的绝对值<=10^9
    在每一部分数据中,均有一半数据保证小块高度非负

题解:

1:将负数坑填平;因为最外面一圈是0,所以可以随便填
2:将最外面一圈(1~m,1~n之间)的点加到小根堆中
3:取出堆顶从堆顶连的四个方向灌水,如果碰见不比它低的点,将其入堆,否则向其中灌水,说明:ans[i][j]+=h-map[i][j]的原因是之前填了负数坑,如果全部数据为正数,则直接ans[i][j]=h-map[i][j]即可
4:输出结果

具体问题看代码

附:STL priority_queue

#include<queue>
#include<cstdio>
#include<iostream></
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值