688. 骑士在棋盘上的概率

125 阅读1分钟

688. 骑士在棋盘上的概率

一个骑士有 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。对于其他情况,

dp[step][i][j]=18×di,djdp[step1][i+di][j+dj]\textit{dp}[{step}][i][j] = \dfrac{1}{8} \times \sum\limits_{\textit{di}, \textit{dj}} \textit{dp}[{step}-1][i+\textit{di}][j+\textit{dj}],其中(di,dj)(\textit{di}, \textit{dj})表示走法对坐标的偏移量,具体为 (-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];
};