將某城市劃分爲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;
}
}