【每日一题】 688. 骑士在棋盘上的概率

在一个 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)

 

posted @ 2024-12-07 17:34  xiaoxinlong  阅读(36)  评论(0)    收藏  举报
AmazingCounters.com