在一个N×N的棋盘上(r, c)处有一个骑士,每一次等概率在棋盘上沿"马"字型跳,当跳了K次后,或者跳出棋盘就停止,问最后停在棋盘上的概率
sol:dp
dp[i][j][k]表示在第i次,在棋盘的(j, k)处的概率
八个方向转移即可
public double knightProbability(int N, int K, int r, int c) {
int[] dx = new int[]{-2, -1, 1, 2, 2, 1, -1, -2};
int[] dy = new int[]{1, 2, 2, 1, -1, -2, -2, -1};
double[][][] dp = new double[2][N][N];
dp[0][r][c] = 1.0;
int cur = 1;
for (int i = 0; i < K; i++) {
clean(dp[cur], N);
for (int j = 0; j < 8; j++) {
for (int a = 0; a < N; a++) {
for (int b = 0; b < N; b++) {
int x = a + dx[j];
int y = b + dy[j];
if (x >= 0 && y >= 0 && x < N && y < N) {
dp[cur][a][b] += 1.0 / 8 * dp[1 - cur][x][y];
}
}
}
}
cur = 1 - cur;
}
double res = 0;
for (int a = 0; a < N; a++) for (int b = 0; b < N; b++) res += dp[K % 2][a][b];
return res;
}
private void clean(double[][] doubles, int N) {
for (int a = 0; a < N; a++) for (int b = 0; b < N; b++) doubles[a][b] = 0;
}