日期:2014-05-20 浏览次数:20747 次
package xj;
public class wood {
public static int woodEffect(int[][] woods,int m,int n){
int total=0;
for(int i=1;i<m-1;i++){
for(int j=1;j<n-1;j++){
int upnum=woods[i-1][j];
int downnum=woods[i+1][j];
int leftnum=woods[i][j-1];
int rightnum=woods[i][j+1];
int num=woods[i][j];
int min=99;
int x=i;
int y=j;
while(x>0){
x--;
if(woods[x][y]>=num){
upnum=woods[x][y];
}
}
if(min>upnum){
min=upnum;
}
x=i;
y=j;
while(x<m-1){
x++;
if(woods[x][y]>=num){
downnum=woods[x][y];
}
}
if(min>downnum){
min=downnum;
}
x=i;
y=j;
while(y>0){
y--;
if(woods[x][y]>=num){
leftnum=woods[x][y];
}
}
if(min>leftnum){
min=leftnum;
}
x=i;
y=j;
while(y<n-1){
y++;
if(woods[x][y]>=num){
rightnum=woods[x][y];
}
}
if(min>rightnum){
min=rightnum;
}
total+=min-num;
}
}
return total;
}
public static void main(String[] args) {
// int[][] woods={{9,9,9,9},{3,0,0,9},{7,8,9,6}};
int[][] woods={{9,9,9,9,9},{9,1,5,1,9},{9,5,6,5,9},{9,2,5,2,9},{9,9,9,9,9}};
System.out.println(wood.woodEffect(woods,5,5));
}
}
二维数组图形化
× 代表板块无用
+ 代表板块边界
- 代表此板块能盛水
.
.
.
最后会暂时形成两个结果
1,一个大桶,此时最简单,取该桶最短板,然后与桶内板块比较, 获得暂时盛水量
2,多个大桶,分别取桶最短板,然后与桶内板块比较,相加, 获得暂时盛水量
这时,第二个问题出现了,大桶内或许还有更深的桶,例如6L所举例
这个时候对桶进行分析,将桶内盛水板块补充为最短边界,这样边界就失效的,继续按照开始所说,
求边界,得到大桶,然后递归分析,直到桶内再没有桶为止
每次取得的暂时盛水量相加,即可得到最终取水量!
看了半天,后面这段还不是看的很明白啊,解题思路没明确,程序还能实现么???