Go语言实现BFS算法|青训营笔记

114 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

一、本次青训营已经进行了很长的时间,训练营也给我们布置了不少任务

以下为一道使用Go语言实现的代码

二、实战题目

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走) 请帮助小青通知小码,小青最快到达时间是多久? 输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

这段代码为算出小青到小码家的最短时间,即为从迷宫中找到最短路径,因此建立无向图,使用图遍历算法(BFS算法) 图遍历算法是指对图中每一个顶点都访问一次,且仅仅只访问一次。而对顶点遍历的顺序的不同,导致了不同的算法。而BFS则是以宽度优先进行的图遍历算法。所谓以宽度优先指的是每一步先遍历顶点的所有相邻顶点,然后再往相邻顶点的相邻顶点进行延伸。这段代码使用了BFS算法实验了来求解小青到小码家的最短时间。 首先,如果N >= K,则直接输出N - K。否则,使用队列来搜索小青到达小码家的最短时间,使用数组d记录每个地点到达时间,如果小青可以到达当前地点,则将该地点入队,并且将其到达时间加一。最后,输出d[k]即可。

相关代码如下 if n >= k {

return n - k

}

q := make([]int, 100000)

h, t := 0, 0

q[0] = n

d := make([]int, 100001)

for i := range d {

d[i] = -1

}d[n] = 0

for h <= t {

x := q[h]

h++

if x == k {

break

}

for _, nx := range []int{x - 1, x + 1, x * 2} {

if nx >= 0 && nx <= 100000 && d[nx] == -1 {

t++

q[t] = nx

d[nx] = d[x] + 1

}

}

}

return d[k]

}