在一个 n x n
的国际象棋棋盘上,一个骑士从单元格 (row, column)
开始,并尝试进行 k
次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0)
,右下单元格是 (n - 1, n - 1)
。
象棋骑士有8种可能的走法,如下图所示。每次移动在基本方向上是两个单元格,然后在正交方向上是一个单元格。
每次骑士要移动时,它都会随机从8种可能的移动中选择一种(即使棋子会离开棋盘),然后移动到那里。
骑士继续移动,直到它走了 k
步或离开了棋盘。
返回 骑士在棋盘停止移动后仍留在棋盘上的概率 。
dfs
DIRS = (2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1) class Solution: def knightProbability(self, n: int, k: int, row: int, column: int) -> float: @cache # 缓存装饰器,避免重复计算 dfs 的结果(记忆化) def dfs(k: int, i: int, j: int) -> float: if not (0 <= i < n and 0 <= j < n): # 出界 return 0 if k == 0: # 走完了,仍然在棋盘上 return 1 return sum(dfs(k - 1, i + dx, j + dy) for dx, dy in DIRS) / 8 return dfs(k, row, column)
标签:移动,int,单元格,dfs,688,骑士,棋盘 From: https://www.cnblogs.com/xxlm/p/18592448