LCP 07. 传递信息
小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:
有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。 每轮信息必须需要传递给另一个人,且信息可重复经过同一个人 给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。
解:
- 首先得知道从一个编号出发,可以去哪些编号,所以用map预处理一下,key是出发编号,val是目标编号数组
- 递归函数的参数含义为,idx:当前在哪个编号,step:当前走了几步。当走了k步并且当前在n - 1编号就意味着一种成功的结果,返回1,否则返回0
- 对于第idx个编号来说,从map中取出他所有能去的编号,遍历递归,把递归返回值累加并返回
const numWays = function(n, relation, k) {
const map = new Map()
relation.forEach((item) => {
const valArr = map.get(item[0])
if (!valArr) {
map.set(item[0], [item[1]])
} else {
map.set(item[0], [...valArr, item[1]])
}
})
const getRes = (idx, step) => {
if (step === k) {
return idx === n - 1 ? 1 : 0
}
// 当前可以去的地方
const canGo = map.get(idx)
let res = 0
if (!canGo) return res
for (let i = 0; i < canGo.length; i++) {
res += getRes(canGo[i], step + 1)
}
return res
}
return getRes(0, 0)
};