算法题-遍历五个坐标的最短路径

题目描述

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

输入描述

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

输出描述

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

示例

输入

200 0 200 10 200 50 200 30 200 25

输出

456

本解法思路

把问题当成全排列,使用回溯法遍历所有可能。(并不是最优解法)

import java.util.*;
public class Main {
    public static int min = Integer.MAX_VALUE;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] xy = new int[10];
        while (in.hasNextInt()) {
            for(int i=0;i<10;i++){
                xy[i] = in.nextInt();
            }
            Queue<Integer> queue = new LinkedList<>();
            help(0,xy,queue);
            System.out.println(min);
        }

    }
    public static void help(int i,int[] xy,Queue<Integer> queue){
        if(i>=xy.length-2){
            int x=0,y=0;
            double tempSum = 0.;
            queue.offer(xy[i]);
            queue.offer(xy[i+1]);
            int cnt = 5;
            while(!queue.isEmpty()){
                int xx = queue.peek();
                System.out.print("("+xx+",");
                queue.poll();
                int yy = queue.peek();
                System.out.print(yy+"),");
                queue.poll();
                tempSum += Math.sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y)) ;
                x = xx;y=yy;
            }
            tempSum += Math.sqrt((0-x)*(0-x)+(0-y)*(0-y));
            System.out.println("sum="+(int)tempSum);
            if((int)tempSum<min){
                min = (int)tempSum;
                return;
            }
        }else {
            for(int j=i;j<xy.length;j+=2){
                swap(i,j,xy);
                swap(i+1,j+1,xy);
                Queue copyQueue = new LinkedList();
                copyQueue.addAll(queue);
                copyQueue.offer(xy[i]);
                copyQueue.offer(xy[i+1]);
                help(i+2,xy,copyQueue);
                swap(i,j,xy);
                swap(i+1,j+1,xy);
            }
        }
    }
    public static void swap(int i,int j,int[] xy){
        int temp = xy[i];
        xy[i] = xy[j];
        xy[j] = temp;
    }
}

运行结果:

(200,0),(200,10),(200,50),(200,30),(200,25),sum=476
(200,0),(200,10),(200,50),(200,25),(200,30),sum=482
(200,0),(200,10),(200,30),(200,50),(200,25),sum=476
(200,0),(200,10),(200,30),(200,25),(200,50),sum=466
(200,0),(200,10),(200,25),(200,30),(200,50),sum=456
(200,0),(200,10),(200,25),(200,50),(200,30),sum=472
(200,0),(200,50),(200,10),(200,30),(200,25),sum=516
(200,0),(200,50),(200,10),(200,25),(200,30),sum=512
(200,0),(200,50),(200,30),(200,10),(200,25),sum=506
(200,0),(200,50),(200,30),(200,25),(200,10),sum=490
(200,0),(200,50),(200,25),(200,30),(200,10),sum=500
(200,0),(200,50),(200,25),(200,10),(200,30),sum=512
(200,0),(200,30),(200,50),(200,10),(200,25),sum=506
(200,0),(200,30),(200,50),(200,25),(200,10),sum=490
(200,0),(200,30),(200,10),(200,50),(200,25),sum=516
(200,0),(200,30),(200,10),(200,25),(200,50),sum=496
(200,0),(200,30),(200,25),(200,10),(200,50),sum=496
(200,0),(200,30),(200,25),(200,50),(200,10),sum=500
(200,0),(200,25),(200,50),(200,30),(200,10),sum=490
(200,0),(200,25),(200,50),(200,10),(200,30),sum=512
(200,0),(200,25),(200,30),(200,50),(200,10),sum=490
(200,0),(200,25),(200,30),(200,10),(200,50),sum=496
(200,0),(200,25),(200,10),(200,30),(200,50),sum=486
(200,0),(200,25),(200,10),(200,50),(200,30),sum=502
(200,10),(200,0),(200,50),(200,30),(200,25),sum=486
(200,10),(200,0),(200,50),(200,25),(200,30),sum=492
(200,10),(200,0),(200,30),(200,50),(200,25),sum=486
(200,10),(200,0),(200,30),(200,25),(200,50),sum=476
(200,10),(200,0),(200,25),(200,30),(200,50),sum=466
(200,10),(200,0),(200,25),(200,50),(200,30),sum=482
(200,10),(200,50),(200,0),(200,30),(200,25),sum=526
(200,10),(200,50),(200,0),(200,25),(200,30),sum=522
(200,10),(200,50),(200,30),(200,0),(200,25),sum=516
(200,10),(200,50),(200,30),(200,25),(200,0),sum=490
(200,10),(200,50),(200,25),(200,30),(200,0),sum=500
(200,10),(200,50),(200,25),(200,0),(200,30),sum=522
(200,10),(200,30),(200,50),(200,0),(200,25),sum=516
(200,10),(200,30),(200,50),(200,25),(200,0),sum=490
(200,10),(200,30),(200,0),(200,50),(200,25),sum=526
(200,10),(200,30),(200,0),(200,25),(200,50),sum=506
(200,10),(200,30),(200,25),(200,0),(200,50),sum=506
(200,10),(200,30),(200,25),(200,50),(200,0),sum=500
(200,10),(200,25),(200,50),(200,30),(200,0),sum=490
(200,10),(200,25),(200,50),(200,0),(200,30),sum=522
(200,10),(200,25),(200,30),(200,50),(200,0),sum=490
(200,10),(200,25),(200,30),(200,0),(200,50),sum=506
(200,10),(200,25),(200,0),(200,30),(200,50),sum=496
(200,10),(200,25),(200,0),(200,50),(200,30),sum=512
(200,50),(200,10),(200,0),(200,30),(200,25),sum=492
(200,50),(200,10),(200,0),(200,25),(200,30),sum=488
(200,50),(200,10),(200,30),(200,0),(200,25),sum=522
(200,50),(200,10),(200,30),(200,25),(200,0),sum=496
(200,50),(200,10),(200,25),(200,30),(200,0),sum=496
(200,50),(200,10),(200,25),(200,0),(200,30),sum=518
(200,50),(200,0),(200,10),(200,30),(200,25),sum=492
(200,50),(200,0),(200,10),(200,25),(200,30),sum=488
(200,50),(200,0),(200,30),(200,10),(200,25),sum=522
(200,50),(200,0),(200,30),(200,25),(200,10),sum=506
(200,50),(200,0),(200,25),(200,30),(200,10),sum=506
(200,50),(200,0),(200,25),(200,10),(200,30),sum=518
(200,50),(200,30),(200,0),(200,10),(200,25),sum=482
(200,50),(200,30),(200,0),(200,25),(200,10),sum=496
(200,50),(200,30),(200,10),(200,0),(200,25),sum=482
(200,50),(200,30),(200,10),(200,25),(200,0),sum=486
(200,50),(200,30),(200,25),(200,10),(200,0),sum=456
(200,50),(200,30),(200,25),(200,0),(200,10),sum=466
(200,50),(200,25),(200,0),(200,30),(200,10),sum=506
(200,50),(200,25),(200,0),(200,10),(200,30),sum=488
(200,50),(200,25),(200,30),(200,0),(200,10),sum=476
(200,50),(200,25),(200,30),(200,10),(200,0),sum=466
(200,50),(200,25),(200,10),(200,30),(200,0),sum=496
(200,50),(200,25),(200,10),(200,0),(200,30),sum=488
(200,30),(200,10),(200,50),(200,0),(200,25),sum=538
(200,30),(200,10),(200,50),(200,25),(200,0),sum=512
(200,30),(200,10),(200,0),(200,50),(200,25),sum=508
(200,30),(200,10),(200,0),(200,25),(200,50),sum=488
(200,30),(200,10),(200,25),(200,0),(200,50),sum=518
(200,30),(200,10),(200,25),(200,50),(200,0),sum=512
(200,30),(200,50),(200,10),(200,0),(200,25),sum=498
(200,30),(200,50),(200,10),(200,25),(200,0),sum=502
(200,30),(200,50),(200,0),(200,10),(200,25),sum=498
(200,30),(200,50),(200,0),(200,25),(200,10),sum=512
(200,30),(200,50),(200,25),(200,0),(200,10),sum=482
(200,30),(200,50),(200,25),(200,10),(200,0),sum=472
(200,30),(200,0),(200,50),(200,10),(200,25),sum=538
(200,30),(200,0),(200,50),(200,25),(200,10),sum=522
(200,30),(200,0),(200,10),(200,50),(200,25),sum=508
(200,30),(200,0),(200,10),(200,25),(200,50),sum=488
(200,30),(200,0),(200,25),(200,10),(200,50),sum=518
(200,30),(200,0),(200,25),(200,50),(200,10),sum=522
(200,30),(200,25),(200,50),(200,0),(200,10),sum=492
(200,30),(200,25),(200,50),(200,10),(200,0),sum=482
(200,30),(200,25),(200,0),(200,50),(200,10),sum=522
(200,30),(200,25),(200,0),(200,10),(200,50),sum=488
(200,30),(200,25),(200,10),(200,0),(200,50),sum=488
(200,30),(200,25),(200,10),(200,50),(200,0),sum=512
(200,25),(200,10),(200,50),(200,30),(200,0),sum=506
(200,25),(200,10),(200,50),(200,0),(200,30),sum=538
(200,25),(200,10),(200,30),(200,50),(200,0),sum=506
(200,25),(200,10),(200,30),(200,0),(200,50),sum=522
(200,25),(200,10),(200,0),(200,30),(200,50),sum=482
(200,25),(200,10),(200,0),(200,50),(200,30),sum=498
(200,25),(200,50),(200,10),(200,30),(200,0),sum=516
(200,25),(200,50),(200,10),(200,0),(200,30),sum=508
(200,25),(200,50),(200,30),(200,10),(200,0),sum=476
(200,25),(200,50),(200,30),(200,0),(200,10),sum=486
(200,25),(200,50),(200,0),(200,30),(200,10),sum=526
(200,25),(200,50),(200,0),(200,10),(200,30),sum=508
(200,25),(200,30),(200,50),(200,10),(200,0),sum=476
(200,25),(200,30),(200,50),(200,0),(200,10),sum=486
(200,25),(200,30),(200,10),(200,50),(200,0),sum=516
(200,25),(200,30),(200,10),(200,0),(200,50),sum=492
(200,25),(200,30),(200,0),(200,10),(200,50),sum=492
(200,25),(200,30),(200,0),(200,50),(200,10),sum=526
(200,25),(200,0),(200,50),(200,30),(200,10),sum=516
(200,25),(200,0),(200,50),(200,10),(200,30),sum=538
(200,25),(200,0),(200,30),(200,50),(200,10),sum=516
(200,25),(200,0),(200,30),(200,10),(200,50),sum=522
(200,25),(200,0),(200,10),(200,30),(200,50),sum=482
(200,25),(200,0),(200,10),(200,50),(200,30),sum=498
456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值