这么一道算法题,放出来大伙思考思考。。。

chlb-icoc-cc 2014-02-19 06:33:05
加精
刚看csdn论坛,于是想到大四时听同学说了这么一道题,当时做了几天没搞出来,题目意思如下:

给你一个二维数组(比如是M*N的),把他们放入M*N的方格中,每个数字代表该方格的高度,这样就俯视就会形成凹凸不平,如果用这个形状存储水,凹的地方会有积水,请问它能存储多少水?
例如二维数组为:
9 9 9 9
3 0 0 9
7 8 9 6
时,答案是中间的0,0位置可以存储3(因为其外面最低是3,即“木桶效应”)个单位的水,因此答案为3+3=6
...全文
12490 149 打赏 收藏 转发到动态 举报
写回复
用AI写文章
149 条回复
切换为时间正序
请发表友善的回复…
发表回复
music过客 2016-10-27
  • 打赏
  • 举报
回复
//有待完善
package vet;
public class vat{
public static void main(String ...args){
int [][]arr = {{9,9,9,9},{3,0,6,9},{7,8,9,6}};

int [][]arr_1 = arr; //Test 取反10-arr[i][i] = arr_1[i][j]
for(int i = 0;i<arr_1.length;i++){
for(int j = 0;j<arr_1[i].length;j++){
arr_1[i][j] = 10-arr_1[i][j];
}
}
int [][]flag = new int[3][4];//用于标记数组
for(int i = 0;i<flag.length;i++){
for(int j = 0;j<flag[i].length;j++){
flag[i][j] = 0;
}
}
//求出取反后数组四条边最低的元素
int max = 0;
for(int i = 0;i<arr_1.length;i++){
for(int j = 0;j<arr_1[i].length;j++){
if(i == 0 || i == arr_1.length-1 || j==0 || j== arr_1[i].length-1){
//System.out.print(arr_1[i][j]);
flag[i][j] = 1;
if(arr_1[i][j]>max){
max = arr_1[i][j];
}
}
}
}
int volume = 0;
for(int i = 0;i<flag.length;i++){
//System.out.println();
for(int j = 0;j<flag[i].length;j++){
if(flag[i][j]==0 && (arr_1[i][j]-max)>0){
volume += arr_1[i][j]-max;
}
}
}
System.out.println(volume);
}
}





music过客 2016-10-27
  • 打赏
  • 举报
回复
反过来想,如果不是盛水而是求凸出来来的面积(意思就是凸出来的体积加上题目中模型化得出木桶,两者结合起来就是一个长方体或者是正方体)
LYRIQ777 2016-10-23
  • 打赏
  • 举报
回复
长知识了,感谢楼主
雨莫2016 2016-10-21
  • 打赏
  • 举报
回复
mark马克
LittleFish_yozo 2016-10-21
  • 打赏
  • 举报
回复
建议先降为一维考虑,得出规律后再推广到二维
把分全给哥 2016-10-21
  • 打赏
  • 举报
回复
liuyangyangNO1 2016-04-15
  • 打赏
  • 举报
回复
引用 28 楼 Android_iPhone 的回复:
简单说说思路: 1)首先,设定好方格二维数组,这个大家想法应该一样 2-1)其次,找到方格中的“至高点” 2-2)按照“至高点”填充所有方格,使其充满最大水量 3)然后开始移除水 3-1)如果在最外层的边界上的话,不能储存水 3-2)然后开始遍历整个数组,如果有能移除的水就移除掉,并且重复步骤3) 直到所有的水都不能移除为止 3-3)水是否能移除,就看当前位置的水位是否比 上下左右的水位高即可 4)打印剩下的水的总和即可 没有使用任何复杂算法,仅通过反复遍历数组就完成了任务
如果矩阵是这样的话: 2 7 0 12 0 6 5 12 15 19 11 7 11 14 13 19 3 5 18 5 19 19 13 7 11 移除水后,储存水量: 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 合计储存水量:7 但是正确的答案不是应该是6嘛,第二行的那个1是不能存储水的。。
NothingSerious2811 2016-04-02
  • 打赏
  • 举报
回复
引用 6楼我是你的主体 的回复:
[quote=引用 4 楼 ljl434841 的回复:] 找出这个二维数组形成木桶时最短那块板,木桶的桶高是有这个数组的“四边”所构成,即a[0][0]...a[0][N-1],a[0][N-1]...a[M-1][N-1],a[M-1][N-1]...a[M-1][0],a[M-1][0]...a[0][0],把这些都放进一个数组,然后找出最小的那个数,也就是最短的木板。然后把除了四边的那些数与这个最短的木板作差,负数则能储水;正数刚高于最低桶边,不能储水,无视之
孩子,你想的简单了。。。 如果二维数组为: 1 1 1 1 1 1 1 5 1 1 1 5 1 5 1 1 1 5 1 1 1 1 1 1 1 按照你的计算方法,你能告诉我它储水为0吗??? 实际上它的积水应该是4才对吧!!![/quote]你都没看明白人家解答的意思
把分全给哥 2016-01-27
  • 打赏
  • 举报
回复
做出来没
daker_129 2016-01-27
  • 打赏
  • 举报
回复
太 tm难了,连二维数组都很少用
hello丶 2016-01-21
  • 打赏
  • 举报
回复
马克...............
把分全给哥 2016-01-18
  • 打赏
  • 举报
回复
算法写出来没
clown.. 2016-01-18
  • 打赏
  • 举报
回复
既然是装水。。那就把它装满水。让它流。找出数组中的最大数max 。这个数乘数组元素个数得到总量。 从最外圈开始比较 。比它小全减掉。再找里面一圈。每个元素元素i与它相邻的三个外圈元素中最小的比较。。比它大 就max-i。比它小。就按最外面的减。。依次往中间比较。。总量减掉流掉的。就是可装的。。估计有我想不到的情况。希望大牛指出
lloveyou_ 2015-10-06
  • 打赏
  • 举报
回复
大一新生表示很迷茫,我只吐槽一下我的思路,老师刚讲完for循环,我无能为力 1,找到最高点,分析它两侧是否都形成存水区, i,找到左侧第二高点,如果左侧第二高点在最高点的旁边,继续找第三高点,第三高点不在第二的旁边,然后就可以求左侧存水 的体积 ii, 右侧思路相同 很荣幸参加回帖
mazijun104 2015-05-29
  • 打赏
  • 举报
回复
mark 一下
javaDaSheng 2015-01-13
  • 打赏
  • 举报
回复
第一步,找出凹形,即内圈值小于外圈的值 第二步,计算凹形池的体积
小鸟学会飞 2015-01-07
  • 打赏
  • 举报
回复
哇塞!很有意思诶
南看台的骄傲 2015-01-06
  • 打赏
  • 举报
回复
构建立体图形。假设有一个高度为1的小积木。数组里的元素是多少,对应的方格里就叠多少个积木。用一个刀片每次横切一个积木的高度。这样就可以比较容易找出刀片下面的方格积水单位。刀片上面的方格元素相应的减一。这样递归就可以得出总的积水单位
laojia315 2014-12-26
  • 打赏
  • 举报
回复
第一反应同4L。。 既然从最外面开始找不行,也许可以从内部往外部进行,
Golden_Dog 2014-08-01
  • 打赏
  • 举报
回复
我的思路是补块:1-----从最低的块(可能是多个)开始判断,如果该块是凹的就补上一个,num+1;如果最低的n块连在一起且它们连起来是凹的就一起各补上一个,num+n; 2-----同样再判断下一次的最低的块(可能多个); 3-----如此循环到最高的那块,取num
加载更多回复(123)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧