LeetCode 688. “馬”在棋盤上的概率
阿新 • • 發佈:2020-09-12
題目連結
題目分析
這個題其實就是一個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; } }