1. 程式人生 > 實用技巧 >LeetCode 688. “馬”在棋盤上的概率

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;
    }
}