bfs+记忆化数组
class Solution {
private static int[][] move = {
{2, 2, 1, 1, -1, -1, -2, -2},
{1, -1, 2, -2, 2, -2, 1, -1}
};
private static double[][][] dp; // 记忆化
public double knightProbability(int N, int K, int r, int c) {
this.dp = new double[K+1][N][N];
return dfs(N, K, 0, 0);
}
public double dfs(int N, int K, int x, int y) {
if (x < 0 || x >= N || y < 0 || y >= N)
return 0;
if (K == 0)
return 1.0;
if (dp[K][x][y] != 0)
return dp[K][x][y];
double sum = 0;
for (int i = 0; i < 8; i++) {
int nx = x + move[0][i];
int ny = y + move[1][i];
sum += dfs(N, K - 1, nx, ny) / 8.0;
}
return dp[K][x][y] = sum;
}
}