LeetCode 688. “马”在棋盘上的概率

题目链接

688. “马”在棋盘上的概率

题目分析

这个题其实就是一个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;
    }
}
posted @ 2020-09-12 21:18  ZJPang  阅读(133)  评论(0编辑  收藏  举报