688. Knight Probability in Chessboard - Detailed Explanation
Problem Statement
You have an N×N chessboard and a knight placed at row r, column c. The knight will make K moves, each chosen uniformly at random from the 8 possible L‑shaped moves. At each step, if the knight moves off the board, it is lost. Compute the probability that after exactly K moves, the knight remains on the board.
Examples
Example 1
Input N = 3, K = 2, r = 0, c = 0
Output 0.0625
Explanation
From (0,0) the knight can move to (2,1) or (1,2) – each with probability 1/8. From each of those, only one of the 8 moves stays on board:
- (2,1) → (0,0)
- (1,2) → (0,0)
So total probability = 2*(1/8)*(1/8) = 1/32 = 0.03125. Wait, that’s 0.03125, but LeetCode’s example actually gives 0.0625 because they count two valid paths back to board at step 2:
(0,0)→(2,1)→(0,0) and (0,0)→(1,2)→(0,0), plus (0,0)→(2,1)→(1,3) is off board, etc.
LeetCode’s official calculation yields 0.0625.
Example 2
Input N = 1, K = 0, r = 0, c = 0
Output 1.0
Explanation
With zero moves, the knight stays at (0,0) with probability 1.
Constraints
- 1 ≤ N ≤ 25
- 0 ≤ K ≤ 100
- 0 ≤ r, c < N
- Answers within 10⁻⁵ absolute error are accepted.
Hints
- How many possible sequences of moves are there? What’s the probability of any single sequence?
- Can you build a DP table
dp[k][i][j]
= probability to be at (i,j) after k moves? - How can you roll DP forward only keeping two layers (
k
andk+1
)?
Approach 1 Iterative DP by Probability Distribution
Idea
Let dp[i][j]
be the probability the knight is on square (i,j)
after the current number of moves. Initially dp[r][c] = 1
. For each move step, build a new table dp2
by distributing each dp[i][j]
equally (1/8) across the 8 possible knight moves that remain on board. After K iterations, summing all dp[i][j]
gives the answer.
Steps
- Initialize a 2D array
dp
of size N×N all zeros, thendp[r][c] = 1.0
. - Define the 8 knight move offsets.
- Repeat K times:
- Create
dp2 =
new N×N zero array. - For each cell
(i,j)
:- If
dp[i][j] > 0
, for each move(dx,dy)
:- Let
(ni, nj) = (i+dx, j+dy)
. - If in bounds,
dp2[ni][nj] += dp[i][j] / 8.0
.
- Let
- If
- Replace
dp = dp2
.
- Create
- Sum all entries in
dp
and return that sum.
Code (Python)
Code (Java)
Approach 2 Top‑Down DFS with Memoization
Idea
Define P(k, i, j)
= probability to remain on board starting from (i,j)
with k
moves left. Then
P(0, i, j) = 1 if (i,j) in board
P(0, i, j) = 0 otherwise
P(k, i, j) = (1/8) * ∑ P(k−1, i+dx, j+dy) over the 8 moves
Memoize the triple (k,i,j)
to avoid recomputation. The answer is P(K, r, c)
.
Steps
- Prepare a 3D memo array
memo[k][i][j]
initialized to-1
. - Write a recursive function
dfs(k,i,j)
:- If
(i,j)
is out of bounds, return 0. - If
k == 0
, return 1. - If
memo[k][i][j] ≥ 0
, return it. - Compute
res = 0
; for each move,res += dfs(k−1, ni, nj)/8
. - Store and return
memo[k][i][j] = res
.
- If
- Call
dfs(K, r, c)
.
Complexity
- Each of the
K·N²
states is computed once, each taking O(1) work over 8 neighbors → O(K N²) time and space.
Complexity Analysis
- Time: O(K N²) for both approaches
- Space: O(N²) (iterative DP) or O(K N²) (memo)
Step‑by‑Step Walkthrough (N=3, K=1, r=0, c=0)
- Initial dp: only dp[0][0] = 1
- After 1 move: from (0,0) two valid moves: (2,1) and (1,2). Each gets 1/8. So dp2[2][1] = dp2[1][2] = 0.125. Sum = 0.25.
Common Mistakes
- Forgetting to divide by 8 at each step (treating it like an unweighted count).
- Not resetting or reusing the DP array properly between iterations.
- Using integer types instead of double/float → underflow to 0.
Edge Cases
- K = 0 → answer = 1 as long as starting cell is on board.
- N = 1 and any K > 0 → knight immediately moves off board → answer = 0.
- Large K relative to N: DP still handles it in O(K N²).
Alternative Variations
- Count expected number of occupied squares after K moves.
- Replace knight with other piece (bishop, rook) – fewer or more move options.
- Infinite board variant – trivial answer = 1 always.
Related Problems
- 62. Unique Paths – count grid paths from top‑left to bottom‑right.
GET YOUR FREE
Coding Questions Catalog