骑士在棋盘上的概率
难度:中等
前面尝试用dfs处理,超时了,看了题解,这道题要用动态规划来解决。
定义 dp[i][j][step] 表示骑士从棋盘上的点 (i, j)(i,j) 出发,走了 step 步时仍然留在棋盘上的概率。
代码如下:
public double knightProbability(int n, int k, int row, int column) {
int[][] dirs = new int[][]{{-2,1},{-2,-1},{-1,2},{-1,-2},{1,2},{1,-2},{2,1},{2,-1}};
double[][][] f = new double[n][n][k+1];
for (int i = 0; i < n; i++) {
//棋盘上每个位置作为起点,经过0步落在棋盘上的概率为1
for (int j = 0; j < n; j++) {
f[i][j][0] = 1;
}
}
for (int step = 1; step <= k; step++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int[] dir : dirs) {
int x = i + dir[0];
int y = j + dir[1];
if (x >= n || y>=n || x<0 || y<0) continue;
f[x][y][step] += f[i][j][step-1]/8;
}
}
}
}
return f[row][column][k];
}
执行结果:成功