【回溯-全排列&&dfs】蜜蜂采蜜

题目描述:

一群蜜蜂离开蜂巢采蜜,要连续采集5片花丛后归巢。已知5片花丛相对蜂巢的坐标,请你帮忙规划一下到访花丛的顺序,使飞行距离最短。

输入描述:

以蜂巢为平面坐标原点的5片花丛A,B,C,D,E的坐标,坐标为整数。

输出描述:

从出发到返回蜂巢最短路径的长度取整值,取整办法为放弃小数点后面的值。

示例:

输入:200 0 200 10 200 50 200 30 200 25

输出:456

说明:

样例中的10个数,相邻两个为一组,表示一个花丛的相对蜂巢的坐标:A(x1,y1),B(x2,y2),C(x3,y3),

D(x4,y4),E(x5,y5).分别代表x1,y1,x2,y2,x3,y3,x4,y4,x5,y5.

此题同:【回溯-全排列&&dfs】OD100. 基站维修工程师一样,由于问题规模也很小,只有5片花丛,所以使用全排列穷举所有路径是最优解决方案

      public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            // 注意 hasNext 和 hasNextLine 的区别
            int[] idx=new int[5];
            for(int i=0;i<points.length;i++){
                points[i][0]=in.nextInt();
                points[i][1]=in.nextInt();
                idx[i]=i;
            }

            permute(idx,0);
            System.out.println(ans);
        }

        private static void permute(int[] nums,int start){
            if(start==nums.length){
                long distance=computeDistance(nums);
                if(ans==null|| ans>distance){
                    ans=distance;
                }
                return;

            }

            for(int i=start;i<nums.length;i++){
                swap(nums,start,i);
                permute(nums,start+1);
                swap(nums,start,i);
            }
        }

        private static void swap(int[] nums,int i,int j){
            int tmp=nums[i];
            nums[i]=nums[j];
            nums[j]=tmp;
        }

        private static long computeDistance(int[] idx){

            double distance=0d;

            distance+=compute(0,0,points[idx[0]][0],points[idx[0]][1]);
            for(int i=0;i<points.length-1;i++){
                distance+=compute(points[idx[i]][0],points[idx[i]][1],
                        points[idx[i+1]][0],points[idx[i+1]][1]);
            }
            distance+=compute(0,0,points[idx[4]][0],points[idx[4]][1]); //注意这一行

            return (long)distance;

        }

        private static double compute(int x1,int y1,int x2,int y2){
            return Math.sqrt(1l*(x1-x2)*(x1-x2)+1l*(y1-y2)*(y1-y2));
        }

算法笔试题解-回溯系列 文章被收录于专栏

算法笔试题解-回溯系列

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务