cargo center

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