【每日一題】 688. 騎士在棋盤上的機率

xiaoxinlong發表於2024-12-07
在一個 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)

相關文章