水(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></