奇安信笔试的算法
2022/9/15
太菜了,两道算法题,只想出了一道,还没写完
在一个100*100的格线网上,某些网线交点上有食物。一只蚂蚁现在原点,它能顺着格线网去吃掉食物。问题:蚂蚁吃掉所有食物,最少爬行多远。
思路:图,广义优先搜索。从(0,0)出发,找到距离当前点最近的点,并且标记已经采集过的点,防止二次计算。将此点作为当前点,循环计算,直到所有点都访问完毕。
func countDis(x, y int) int {
if x < 0 {
x = -x
}
if y < 0 {
y = -y
}
return x + y
}
func getMinLen(points [][]int) int {
// write code here
ans := 0
rep := make([]bool, len(points))
q := make([][]int, 0)
q = append(q, []int{0, 0})
for len(q) != 0 {
curr := q[0]
q = q[1:]
min := math.MaxInt32
minD := 0
x, y := 0, 0
for k, v := range points {
if rep[k] {
continue
}
dis := countDis(curr[0]-v[0], curr[1]-v[1])
if min > dis {
//走到此位置距离最短,记录是哪个点
min = dis
minD = k
x, y = v[0], v[1]
}
}
if x == y && y == 0 {
break
}
rep[minD] = true
ans += min
q = append(q, []int{x, y})
}
fmt.Println(ans)
return ans
}
测试:
func main() {
q := [][]int{{0, 5}, {1, 1}}
getMinLen(q)
}
(0, 5)(1, 1)为标记的点,找到最短爬行距离为7
先到(1,1),再到(0,5)
另外一个案例:(0,1), (0,2), (0,3) 最短爬行距离为3