读书人

[help]C语言积水有关问题

发布时间: 2012-04-06 12:22:24 作者: rapoo

[help]C语言积水问题~
题目:一块不平整长方形土地坑坑洼洼,大雨过后,坑里都积满了水(假设边界以外的地方高度都低于边界,见下面示意图,灰色部分为长方形土地,其中深灰色部分为边界;白色部分为边界以外的地方;数字为每小块土地的高度;边界以外的数据不需要输入)。
123443322
2691067773
238569353
241438373
2424510375
242219331
133333532
111222421
把这块土地划分成N×M块,每块大小都是1cm×1cm。如果已知每小块土地的高度(值为正整数,单位:cm),求这块土地共可以积水多少立方厘米(积水土坑的边界只考虑前后左右,不考虑斜方向,如上图,阴影部分为可以积水的地方)。数据输入(要求使用文件输入):第一行是N、M的值(N,M<=1000),下面N行,每行有M个整数,表示该行每块土地的高度(注:所有数据都以空格分隔)。输出:积水量(cm3)
-------------------------------------------------------------------------

能否给我一个大体的思路?迷茫中。。。

[解决办法]
简单的说下思路
先说下几个定义:
(1)块(k,j)与块(i,j)(k < i)上连接:对于任何的m<i && m>=k都有height(m,j)>=height(i,j).相似的还有左连接,右连接,下连接。
(2)块(i,j)的最大上连接高度:所有满足与块(i,j)上连接的行最小(即k最小)的块的高度。类似的有最大左连接高度,最大上连接高度,最大下连接高度。

对于每块土地设置4个属性maxLeft,maxRight,maxTop,maxLow,分别表示每块土地的最大左连接高度,最大右连接高度,最大上连接高度,最大下连接高度,并初始化为0。

1.获得所有块的最大上连接高度
从第一列开始,逐列从上向下扫描,将当前块(i,j)的最大上连接高度设置为max( height(i-1,j),maxTop(i-1,j))。
相似的,我们获得所有块的最大左连接高度,最大右连接高度以及最大下连接高度。

2.对于每个块(i,j)取该块的最大左连接高度,最大右连接高度,最大上连接高度,最大下连接高度的最小值min,若min大于height(i,j),则该块的容量为min - height(i,j),否则为0.

3.将所有块的容量加在一起即为总容量。



[解决办法]
设每个格子的高度都>0
水位从1到最高方块对应高度循环,
选每个高度等于当前水位且未填过的格子作为种子,
填的条件是:未填过且格高度≠0且格高度≤当前水位:
边界的高度为0
如果填某个区域时碰到了边界,修改该区域中每个格子的高度为0
对得到的结果计算积水体积并比较,得到可能的最高水位。
试试看吧

读书人网 >C语言

热点推荐