一个骑士有 8 种可能的走法,骑士会从中以等概率随机选择一种。部分走法可能会让骑士离开棋盘,另外的走法则会让骑士移动到棋盘的其他位置,并且剩余的移动次数会减少 1。
定义 dp[step][i][j] 表示骑士从棋盘上的点 (i, j) 出发,走了 step 步时仍然留在棋盘上的概率。特别地,当点(i,j)不在棋盘上时,dp[step][i][j]=0;当点(i,j) 在棋盘上且step=0 时,dp[step][i][j]=1。对于其他情况,
,其中表示走法对坐标的偏移量,具体为 (-2, -1),(-2,1),(2,-1),(2,1),(-1,-2),(-1,2),(1,-2),(1,2)共 8 种。
var arr = [
[-2, -1],
[-2, 1],
[2, -1],
[2, 1],
[-1, -2],
[-1, 2],
[1, -2],
[1, 2]
];
var knightProbability = function(n, k, row, column) {
var dp = new Array(k + 1).fill(0).map(
() => new Array(n).fill(0).map(
() => new Array(n).fill(0)
)
);
for (var step = 0; step <= k; step++) {
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (step === 0) {
dp[step][i][j] = 1;
} else {
for (var brr of arr) {
var ni = i + brr[0]
var nj = j + brr[1];
if (ni >= 0 && ni < n && nj >= 0 && nj < n) {
dp[step][i][j] += dp[step - 1][ni][nj] / 8;
}
}
}
}
}
}
return dp[k][row][column];
};