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

蜂巢在坐标(0,0)的位置,有五处花丛,蜜蜂从蜂巢出发,要把五处花丛的花蜜采完再回到蜂巢,最短距离是多少。输入说明:一行输入,10个数分别是五处花丛的坐标(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5),用空格隔开。输出说明:输出最短距离,距离向下取整。时间:C/C++5秒其他10秒

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

代码,算法时间复杂度很高,遍历所有可能性

package com;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class JF {
    static ArrayList<String[]> list = new ArrayList();
    static HashMap<String, int[]> hashMap;
    static int min = Integer.MAX_VALUE;

    public static void main(String[] args) {
        //200, 0 ,200, 10 ,200 ,50 ,200, 30, 200, 25
        String[] numbers = {"A", "B", "C", "D", "E"};
        hashMap = new HashMap<>();
        hashMap.put("A", new int[]{200, 0});
        hashMap.put("B", new int[]{200, 10});
        hashMap.put("C", new int[]{200, 50});
        hashMap.put("D", new int[]{200, 30});
        hashMap.put("E", new int[]{200, 25});

        getOne(new boolean[numbers.length], numbers, "");
        for (String[] strings : list) {
            System.out.println(Arrays.toString(strings) + "=" + (int) getInstance(strings));
            if ((int) getInstance(strings)<min){
                min=(int) getInstance(strings);
            }
        }
        System.out.println(min);

    }

    public static void getOne(boolean[] flags, String[] numbers, String numStr) {

        boolean print = true;
        for (int i = 0; i < numbers.length; i++) {
            print = print && flags[i];
        }
        if (print) {
            String s = numStr.substring(0, numStr.length() - 1);
            String[] split = s.split(",");
            //System.out.println(Arrays.toString(split));
            list.add(split);
            return;
        }
        for (int i = 0; i < numbers.length; i++) {
            if (!flags[i]) {
                flags[i] = true;
                getOne(flags, numbers, numStr + numbers[i] + ",");
                flags[i] = false;
            }

        }

    }

    public static double getInstance(String[] strings) {
        double sum = 0;
        int x = 0;
        int y = 0;
        for (int i = 0; i < strings.length; i++) {
            int[] ints = hashMap.get(strings[i]);
            sum += getInstance(x, y, ints[0], ints[1]);
            x = ints[0];
            y = ints[1];
        }
        sum += getInstance(x, y, 0, 0);
        return sum;
    }

    public static double getInstance(int x1, int y1, int x2, int y2) {
        double result = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        return result;
    }

}

输出

[A, B, C, D, E]=476
[A, B, C, E, D]=482
[A, B, D, C, E]=476
[A, B, D, E, C]=466
[A, B, E, C, D]=472
[A, B, E, D, C]=456
[A, C, B, D, E]=516
[A, C, B, E, D]=512
[A, C, D, B, E]=506
[A, C, D, E, B]=490
[A, C, E, B, D]=512
[A, C, E, D, B]=500
[A, D, B, C, E]=516
[A, D, B, E, C]=496
[A, D, C, B, E]=506
[A, D, C, E, B]=490
[A, D, E, B, C]=496
[A, D, E, C, B]=500
[A, E, B, C, D]=502
[A, E, B, D, C]=486
[A, E, C, B, D]=512
[A, E, C, D, B]=490
[A, E, D, B, C]=496
[A, E, D, C, B]=490
[B, A, C, D, E]=486
[B, A, C, E, D]=492
[B, A, D, C, E]=486
[B, A, D, E, C]=476
[B, A, E, C, D]=482
[B, A, E, D, C]=466
[B, C, A, D, E]=526
[B, C, A, E, D]=522
[B, C, D, A, E]=516
[B, C, D, E, A]=490
[B, C, E, A, D]=522
[B, C, E, D, A]=500
[B, D, A, C, E]=526
[B, D, A, E, C]=506
[B, D, C, A, E]=516
[B, D, C, E, A]=490
[B, D, E, A, C]=506
[B, D, E, C, A]=500
[B, E, A, C, D]=512
[B, E, A, D, C]=496
[B, E, C, A, D]=522
[B, E, C, D, A]=490
[B, E, D, A, C]=506
[B, E, D, C, A]=490
[C, A, B, D, E]=492
[C, A, B, E, D]=488
[C, A, D, B, E]=522
[C, A, D, E, B]=506
[C, A, E, B, D]=518
[C, A, E, D, B]=506
[C, B, A, D, E]=492
[C, B, A, E, D]=488
[C, B, D, A, E]=522
[C, B, D, E, A]=496
[C, B, E, A, D]=518
[C, B, E, D, A]=496
[C, D, A, B, E]=482
[C, D, A, E, B]=496
[C, D, B, A, E]=482
[C, D, B, E, A]=486
[C, D, E, A, B]=466
[C, D, E, B, A]=456
[C, E, A, B, D]=488
[C, E, A, D, B]=506
[C, E, B, A, D]=488
[C, E, B, D, A]=496
[C, E, D, A, B]=476
[C, E, D, B, A]=466
[D, A, B, C, E]=508
[D, A, B, E, C]=488
[D, A, C, B, E]=538
[D, A, C, E, B]=522
[D, A, E, B, C]=518
[D, A, E, C, B]=522
[D, B, A, C, E]=508
[D, B, A, E, C]=488
[D, B, C, A, E]=538
[D, B, C, E, A]=512
[D, B, E, A, C]=518
[D, B, E, C, A]=512
[D, C, A, B, E]=498
[D, C, A, E, B]=512
[D, C, B, A, E]=498
[D, C, B, E, A]=502
[D, C, E, A, B]=482
[D, C, E, B, A]=472
[D, E, A, B, C]=488
[D, E, A, C, B]=522
[D, E, B, A, C]=488
[D, E, B, C, A]=512
[D, E, C, A, B]=492
[D, E, C, B, A]=482
[E, A, B, C, D]=498
[E, A, B, D, C]=482
[E, A, C, B, D]=538
[E, A, C, D, B]=516
[E, A, D, B, C]=522
[E, A, D, C, B]=516
[E, B, A, C, D]=498
[E, B, A, D, C]=482
[E, B, C, A, D]=538
[E, B, C, D, A]=506
[E, B, D, A, C]=522
[E, B, D, C, A]=506
[E, C, A, B, D]=508
[E, C, A, D, B]=526
[E, C, B, A, D]=508
[E, C, B, D, A]=516
[E, C, D, A, B]=486
[E, C, D, B, A]=476
[E, D, A, B, C]=492
[E, D, A, C, B]=526
[E, D, B, A, C]=492
[E, D, B, C, A]=516
[E, D, C, A, B]=486
[E, D, C, B, A]=476
456

另一个版本:
https://blog.csdn.net/rocling/article/details/103196938?utm_source=app

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值