题目
在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0) ,右下单元格是 (n - 1, n - 1) 。
象棋骑士有8种可能的走法,如下图所示。每次移动在基本方向上是两个单元格,然后在正交方向上是一个单元格。
每次骑士要移动时,它都会随机从8种可能的移动中选择一种(即使棋子会离开棋盘),然后移动到那里。
骑士继续移动,直到它走了 k 步或离开了棋盘。
返回 骑士在棋盘停止移动后仍留在棋盘上的概率 。
链接:https://leetcode-cn.com/problems/knight-probability-in-chessboard
思路
动态规划四部曲
- 子问题定义
- 状态转移方程
- 初始状态
- 填表顺序
本题dp数组是三维数组,表示经过t步,在位置(i,j)的概率。
根据初始状态的不同,本题有两种不同的理解方式。
方法一
假设初始在(row,column),将k步的结果累加。
方法二
假设棋盘中每个点概率均为1,返回初始位置(row,column)的概率。
代码
方法一
class Solution {
public:
double knightProbability(int n, int k, int row, int column) {
vector<vector<int>> dir={
{
1,2},{
-1,2},{
-1,-2},{
1,-2},{
2,1},{
-2,1},{
-2,-1},{
2,-1}};
vector<vector<