算法学习记录(一零二)

145 阅读1分钟

LCP 07. 传递信息

小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:

有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。 每轮信息必须需要传递给另一个人,且信息可重复经过同一个人 给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。

image.png

解:

  1. 首先得知道从一个编号出发,可以去哪些编号,所以用map预处理一下,key是出发编号,val是目标编号数组
  2. 递归函数的参数含义为,idx:当前在哪个编号,step:当前走了几步。当走了k步并且当前在n - 1编号就意味着一种成功的结果,返回1,否则返回0
  3. 对于第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)
};