题目7 街区最短路径问题

街区最短路径问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述一个街区有很多住户,街区的街道只能为东西、南北两种方向。

住户只可以沿着街道行走。

各个街道之间的间隔相等。

用(x,y)来表示住户坐在的街区。

例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

现在要建一个邮局,使得各个住户到邮局的距离之和最少。

求现在这个邮局应该建在那个地方使得所有住户距离之和最小;

输入第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出每组数据输出到邮局最小的距离和,回车结束;样例输入
2
3
1 1
2 1
1 2
5
2 9 
5 20
11 9
1 1
1 20
样例输出
2
44


这回是正确的了

public class Main {

      public static void main(String[] args) throws IOException {


        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));


        int groupCount = Integer.valueOf(reader.readLine());


        for(int i = 0;i<groupCount;i++){


            int count = Integer.valueOf(reader.readLine());


            int[] x = new int[count];
            int[] y = new int[count];


            String[] point = reader.readLine().split(" ");
            x[0] = Integer.valueOf(point[0]);
            y[0] = Integer.valueOf(point[1]);
            for(int j = 1;j<count;j++){


                point = reader.readLine().split(" ");
                int xTemp = Integer.valueOf(point[0]);
                int yTemp = Integer.valueOf(point[1]);


                boolean sign =true;


                for(int m = 0;m<j;m++){
                    if(x[m]>xTemp){


                        for(int jm = j;jm>m;jm--){
                            x[jm] = x[jm-1];
                        }


                        sign = false;
                        x[m] = xTemp;
                        break;


                    }
                }


                if(sign)
                  x[j] = xTemp;


                sign = true;
                for(int n = 0;n<j;n++){
                    if(y[n]>yTemp){


                        for(int jn = j;jn>n;jn--){
                            y[jn] = y[jn-1];
                        }
                        sign = false;
                        y[n] = yTemp;
                        break;
                    }
                }


                if(sign)
                    y[j] = yTemp;
            }




            int length = 0;


            int l = count/2;
            for(int m = 0;m<l;m++){


                length += x[count-1-m]-x[m]+y[count-1-m]-y[m];
            }




            System.out.println(length);


        }


    }


}





你可能感兴趣的:(题目7 街区最短路径问题)