• 落地成盒-发快递


    ali 笔试题一道

    如图,某物流派送员p,需要给a、b、c、d4个快递点派送包裹,请问派送员需要选择什么的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,且边长为1,如p到d的距离就是4。随机输入n个派送点坐标,求输出最短派送路线值(从起点开始完成n个点派送并回到起始点的距离)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59

    package main

    import (
    "math"
    "fmt"
    )

    type Point struct {

    x, y int

    isVisited bool

    }

    var startPoint = Point{0,0,false} // 设置 零点

    var MinPath = int(^uint(0) >> 1) // max value of int

    func (p1 *Point)Length(p2 *Point) (int) {
    // go 的abs 比较蛋疼
    return int(math.Abs(float64(p1.x) - float64(p2.x)) + math.Abs(float64(p1.x) - float64(p2.x)))
    }

    func Find(start *Point, points []*Point, sum int, count int) int {
    if count == len(points) {
    MinPath = int(math.Min(float64(MinPath), float64(sum + start.Length(&startPoint))))
    }
    for _, v := range points {
    if v.isVisited == false {
    sum += v.Length(start)
    if sum < MinPath {
    // 选择最短路径执行
    v.isVisited = true
    Find(v, points, sum, count+1)
    }
    sum -= v.Length(start)
    v.isVisited = false
    }
    }
    return MinPath
    }

    func main () {
    var numOfPoint = 0
    fmt.Scanf("%d", &numOfPoint)

    var Points []*Point

    for i:=0;i<numOfPoint;i++ {
    var x, y int
    fmt.Scanf("%d %d", &x, &y)
    Points = append(Points, &Point{x, y, false})
    }
    var min = Find(&startPoint, Points, 0, 0)

    fmt.Println(min)
  • 相关阅读:
    4.1.4协变和逆变 不常用
    4.1.33匿名方法Lambda语法
    4.1.1委托和广播
    1.4.3用户定义异常类
    1.4.2异常处理
    1.3.6接口判断及显式实现比较
    常用正则表达式
    git
    Pod 操作
    C语言指针的初始化和赋值
  • 原文地址:https://www.cnblogs.com/xiaoerli520/p/9624353.html
Copyright © 2020-2023  润新知