题目地址:https://leetcode-cn.com/problems/na-ying-bi/
小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:
给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。
示例 1:
输入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3
输出:3
解释:信息从小 A 编号 0 处开始,经 3 轮传递,到达编号 4。共有 3 种方案,分别是 0->2->0->4, 0->2->1->4, 0->2->3->4。
示例 2:
输入:n = 3, relation = [[0,2],[2,1]], k = 2
输出:0
解释:信息不能从小 A 处经过 2 轮传递到编号 2
限制:
2 <= n <= 10
1 <= k <= 5
1 <= relation.length <= 90, 且 relation[i].length == 2
0 <= relation[i][0],relation[i][1] < n 且 relation[i][0] != relation[i][1]
给出了一个有向图,问从 起点 0 出发,经过 k 次到达 N - 1的方案数有多少。
这个题目是个搜索问题,可以用 DFS和 BFS 解决,两者没有优劣之分。
如果使用 BFS,可以用记录步数的 BFS 模板。把起点 0 先放入队列中,每一次把现在队列中已经有的每个节点的后续的所有的节点都放到队列中,即同时走了一步。当总的走了 k 步并且恰好到了 N - 1的时候,就是一个合理的路径。
由于题目说了,信息可以重复经过同一个人,所以不需要记录节点是否visited。
Python代码如下:
class Solution:
def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
queue = collections.deque()
queue.append(0)
step = 0
res = 0
while queue and step <= k:
size = len(queue)
for i in range(size):
cur = queue.popleft()
if cur == n - 1 and step == k:
res += 1
for rel in relation:
if rel[0] != cur:
continue
nxt = rel[1]
queue.append(nxt)
step += 1
return res
欢迎关注负雪明烛的刷题博客,leetcode刷题800多,每道都讲解了详细写法!
2020 年 4 月 18 日 —— 个人赛蒙了
手机扫一扫
移动阅读更方便
你可能感兴趣的文章