题目链接
题目分析
这个题其实就是一个dfs类型的题目,我们从开始点出发,一直向8个方向出发,如果遇到越界的情况就直接返回0。
直到K为0,即把K步走完了,那就返回1,那么我们当前这一步取一个ans累加下一步能够到达K == 0 的概率。
最后返回ans / 8即可。当然这个题直接暴力做会t,我们需要用备忘录的方法去解决问题,因为我们可能会出现很多重复搜索的地方。
代码实现
class Solution {
double[][][] memo;
int[] rid = {-2, -1, 1, 2, 2, 1, -1, -2};
int[] cid = {-1, -2, -2, -1, 1, 2, 2, 1};
public double knightProbability(int N, int K, int r, int c) {
memo = new double[N][N][K + 1];
return dfs(N, K, r, c);
}
public double dfs(int N, int K, int r, int c){
if(r < 0 || r >= N || c < 0 || c >= N){
return 0;
}
if(K == 0){
return 1.0;
}
if(memo[r][c][K] != 0){
return memo[r][c][K];
}
double ans = 0;
for(int i = 0; i < rid.length; i++){
ans += dfs(N, K - 1, r + rid[i], c + cid[i]);
}
memo[r][c][K] = ans / 8.0;
return ans / 8.0;
}
}