688. Knight Probability in Chessboard
Link: https://leetcode.com/problems/knight-probability-in-chessboard/
On an n x n
chessboard, a knight starts at the cell (row, column)
and attempts to make exactly k
moves. The rows and columns are 0-indexed, so the top-left cell is (0, 0)
, and the bottom-right cell is (n - 1, n - 1)
.
A chess knight has eight possible moves it can make, as illustrated below. Each move is two cells in a cardinal direction, then one cell in an orthogonal direction.

Each time the knight is to move, it chooses one of eight possible moves uniformly at random (even if the piece would go off the chessboard) and moves there.
The knight continues moving until it has made exactly k
moves or has moved off the chessboard.
Return the probability that the knight remains on the board after it has stopped moving.
Example 1:
Input: n = 3, k = 2, row = 0, column = 0
Output: 0.06250
Explanation: There are two moves (to (1,2), (2,1)) that will keep the knight on the board.
From each of those positions, there are also two moves that will keep the knight on the board.
The total probability the knight stays on the board is 0.0625.
Example 2:
Input: n = 1, k = 0, row = 0, column = 0
Output: 1.00000
Constraints:
1 <= n <= 25
0 <= k <= 100
0 <= row, column <= n - 1
Solution
Let dp[s, i, j]
denote the probability that the knight starts at position (i, j)
and remains in chessboard at s
-th step. Then we can have:
-
If
s = 0
, then for any valid0 <= i, j < n
,dp[0, i, j] = 1
denotes that the knight "stays" at(i, j)
and has done nothing. -
Otherwise,
where
denotes the 8 possible moved positions.
using pair_t = pair<int, int>;
using vec = vector<double>;
using vec2 = vector<vec>;
using vec3 = vector<vec2>;
class Solution
{
public:
double knightProbability(int n, int k, int row, int column)
{
vec3 dp(k + 1, vec2(n, vec(n, 0)));
vector<pair_t> dirs = {{-1, -2}, {-2, -1}, {-2, 1}, {-1, 2},
{1, -2}, {2, -1}, {2, 1}, {1, 2}};
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
dp[0][i][j] = 1;
auto valid = [=](int x, int y) { return 0 <= x && x < n && 0 <= y && y < n; };
for (int s = 1; s <= k; ++s)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
for (auto [dx, dy]: dirs)
{
int x = i + dx, y = j + dy;
if (valid(x, y))
dp[s][i][j] += dp[s - 1][x][y] / 8;
}
}
}
}
return dp[k][row][column];
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具