- 主题:问大牛们一道地区降雨量的算法题
有一个m*n的二维数组(m、n均大于1),用来表示一个方形区域的地形图。
二维数组里面存的都是非负数,值表示该点的高度。
每一个像素点对应的面积计为1。
m*n二维数组以外的地区,默认高度均为0。
现在开始下雨了。显然,只有地图上形成盆地的地方能存到雨水。问(例如一个像素比上下左右四个值都小即可蓄水,这里假设不需要比左上、左下、右下、右上四个值低),这个地区最多能存储到多少雨量?
怎么用C语言高效率地实现这个算法?
谢谢!
--
修改:heanonlia FROM 49.92.60.*
FROM 49.92.60.*
不是大牛,瞎说几句,直观上这不是一个两重for循环能搞定?
能优化的地方,可能是这个判定:如果一个点确定为盆地,那么它四周的4个点一定不是盆地。
不过这个判定的计算量,和(M *N) 的规模比,小。
--
FROM 221.220.175.*
如果连续一片像素是个大盆地,应该怎么判断?我就是有点纠结这个。
【 在 z16166 (Netguy) 的大作中提到: 】
: 不是大牛,瞎说几句,直观上这不是一个两重for循环能搞定?
: 能优化的地方,可能是这个判定:如果一个点确定为盆地,那么它四周的4个点一定不是盆地。
: 不过这个判定的计算量,和(M *N) 的规模比,小。
: ...................
--
FROM 221.224.146.*
如果某个点的海拔高度不大于其在上/下/左/右某个方向上的邻点的海拔高度(即计算四个方向上的梯度),就一直递归检测。
可能要用一个(M+1) * (N+1)的伴随矩阵来存放检测过的状态,已经检测出结论的不需要再重复搞。
【 在 heanonlia 的大作中提到: 】
: 如果连续一片像素是个大盆地,应该怎么判断?我就是有点纠结这个。
--
修改:z16166 FROM 221.220.175.*
FROM 221.220.175.*
肯定有个“最”盆地,把这个地区+1,递归,直到边界溢出。
所有的“+1”求和就是蓄水量。
【 在 heanonlia 的大作中提到: 】
: 如果连续一片像素是个大盆地,应该怎么判断?我就是有点纠结这个。
--
FROM 125.33.205.*
如果一滴雨落在一个山峰上,四周都比他低,那这滴雨落到哪个放心?还是8个方向每人平分一点
--
FROM 58.32.8.*
题目的意思应该是:每个像素的正上方都会有雨水往下落,反正落到溢出为止。
较高的像素区域如果有雨水流到外面,最多最多也就把周围盆地区域填满。
所以高处山峰上的水往哪边流,是不需要考虑的问题,这个题目只求最终结果的雨量,中途往哪边流,不需要考虑。
【 在 Madlee 的大作中提到: 】
: 如果一滴雨落在一个山峰上,四周都比他低,那这滴雨落到哪个放心?还是8个方向每人平分一点
--
FROM 221.224.146.*
我记得一维的问题是个leetcode题目,二维不知道是不是也是
【 在 heanonlia (恒等式) 的大作中提到: 】
: 有一个m*n的二维数组(m、n均大于1),用来表示一个方形区域的地形图。
: 二维数组里面存的都是非负数,值表示该点的高度。
: 每一个像素点对应的面积计为1。
: m*n二维数组以外的地区,默认高度均为0。
--
FROM 124.78.193.*
先以四边为边界,最低的那个点一定存不了水,把点删掉,更新边界,如果当前最小的点边界要高,表示可以存水,重复下去
【 在 heanonlia 的大作中提到: 】
: 有一个m*n的二维数组(m、n均大于1),用来表示一个方形区域的地形图。
: 二维数组里面存的都是非负数,值表示该点的高度。
: 每一个像素点对应的面积计为1。
: ....................
--
FROM 114.241.15.*
你这是孤立域算法,很成熟的,一般分为广度优先搜索和深度优先搜索两种。我三维的都写过
【 在 heanonlia 的大作中提到: 】
: 有一个m*n的二维数组(m、n均大于1),用来表示一个方形区域的地形图。
: 二维数组里面存的都是非负数,值表示该点的高度。
: 每一个像素点对应的面积计为1。
: ...................
--来自微水木3.5.8
--
FROM 117.100.157.*