688. 骑士在棋盘上的概率 - Kotlin 动态规划

Smile_slime_47

Problem: 688. 骑士在棋盘上的概率

思路

为第i次移动时,棋子停留在的可能性

由于不论是否会走出棋盘,棋子向八个方向移动的概率都为0.125

对于第i次情况的每一个位置,枚举其可能移动到的位置,对于其中那些停留在棋盘上的情况,其i+1次的可能性即为

最终输出第k次情况下棋盘上所有位置的可能性之和即可

复杂度

时间复杂度:

空间复杂度:

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
fun knightProbability(n: Int, k: Int, row: Int, column: Int): Double {
val dp = Array(k + 1) { Array(n) { DoubleArray(n) { (0).toDouble() } } }
dp[0][row][column] = (1).toDouble()

for (i in 0 until k) {
for (r in 0 until n) {
for (c in 0 until n) {
if (r - 1 >= 0 && c - 2 >= 0) dp[i + 1][r - 1][c - 2] += dp[i][r][c] * 0.125
if (r - 2 >= 0 && c - 1 >= 0) dp[i + 1][r - 2][c - 1] += dp[i][r][c] * 0.125
if (r - 1 >= 0 && c + 2 < n) dp[i + 1][r - 1][c + 2] += dp[i][r][c] * 0.125
if (r + 2 < n && c - 1 >= 0) dp[i + 1][r + 2][c - 1] += dp[i][r][c] * 0.125
if (r + 1 < n && c - 2 >= 0) dp[i + 1][r + 1][c - 2] += dp[i][r][c] * 0.125
if (r - 2 >= 0 && c + 1 < n) dp[i + 1][r - 2][c + 1] += dp[i][r][c] * 0.125
if (r + 1 < n && c + 2 < n) dp[i + 1][r + 1][c + 2] += dp[i][r][c] * 0.125
if (r + 2 < n && c + 1 < n) dp[i + 1][r + 2][c + 1] += dp[i][r][c] * 0.125
}
}
}

var sum = (0).toDouble()
for (r in 0 until n) {
for (c in 0 until n) {
sum += dp[k][r][c]
}
}
return sum
}
}
Comments
On this page
688. 骑士在棋盘上的概率 - Kotlin 动态规划