将某城市划分为m*n个区域,每个区域货物量保存在二维数组。将每个区的货物送到一个cargo center,汽车只能上,下,左,右,四个方向移动。求center使所有货物运到这儿的cost最小。
初中物理有道题,给你一块不均匀木板,如何找到它的重心。用一根绳吊起来,画一条垂直线,再换个地方吊起了画出垂直线。两线交叉的地方就是重心。
这道题也是一样,先找出最小的列使所有点到这一列的cost最小。再找到行所有点到这一行的cost最小。so返回找到的行号和列号。
某公司的笔试题,是不是很简单,让我哭会。为啥当时就没做出来呢!!
public class Cargo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//int[][] A = new int[][]{{0,0,2,5},{6,0,0,0}};
int[][] A = new int[][]{{0,2,0,5},{1,0,0,0}};
int[] result = new int[2];
result = findCenter(A);
System.out.println("row:"+result[0]+" col:"+result[1]);
}
public static int[] findCenter(int[][] A){
int[] result = new int[2];
int rows = A.length;
int cols = (A[0]).length;
int minSum = Integer.MAX_VALUE;
int minCol=0;
// find col
for(int col=0; col<cols; col++){
int sum = 0;
for(int j=0; j<cols; j++){
for(int i=0; i<rows; i++){
sum += A[i][j] * Math.abs(col-j);
}
}
if(sum<minSum){
minSum = sum;
minCol = col;
}
}
// find row
minSum = Integer.MAX_VALUE;
int minRow = 0;
// find row
for(int row=0; row<rows; row++){
int sum = 0;
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
sum += A[i][j] * Math.abs(row-i);
}
}
if(sum<minSum){
minSum = sum;
minRow = row;
}
}
result[0] = minRow;
result[1] = minCol;
return result;
}
}