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