LeetCode668马在棋盘上的概率
已知一个 N
xN
的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0)
,最右下角的记为 (N-1, N-1)
。
现有一个 “马”(也译作 “骑士”)位于 (r, c)
,并打算进行 K
次移动。
如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。
class Solution(object): def knightProbability(self, N, K, r, c): """ :type N: int :type K: int :type r: int :type c: int :rtype: float """ dp = [] count = 0.0 for i in range(K+1): temp1 = [] for j in range(N): temp1.append([0] * N) dp.append(temp1) dp[0][r][c] = 1 directions = [(1,2),(1,-2),(2,1),(2,-1),(-1,2),(-1,-2),(-2,1),(-2,-1)] for n in range(1,K+1): for x in range(N): for y in range(N): for (X,Y) in directions: if (x+X) >= 0 and (x+X) < N and (y+Y) >= 0 and (y+Y) < N: dp[n][x][y] += dp[n-1][x+X][y+Y] #计算第n次棋盘中每个位置可能出现的次数 for i in dp[-1]: for j in i: count += j return count / 8 ** K