力扣每日一题2022-02-17中等题:骑士在棋盘上的概率


题目描述

骑士在棋盘上的概率


思路

动态规划

一个骑士有8种可能的走法,骑士会从中以等概率随机选择一种,部分走法可能会让骑士离开棋盘,其他的走法会让骑士移动到棋盘的其他位置,并且剩余的移动次数会减少1。
定义dp[step][i][j]表示骑士从棋盘上的点(i, j)出发,走了step步时仍然留在棋盘上的概率。当(i, j)不在棋盘上时,概率为0;当(i, j)在棋盘上且step=0,概率为1。对于其他情况,
d p [ s t e p ] [ i ] [ j ] = 1 8 ∗ ∑ d i , d j d p [ s t e p − 1 ] [ i + d i ] [ j + d j ] dp[step][i][j] = \frac{1}{8} * \sum_{di, dj}dp[step-1][i+di][j+dj] dp[step][i][j]=81di,djdp[step1][i+di][j+dj]
其中(di, dj)为该走法对坐标的偏移量,共有8种。

Python实现
class Solution:
    def knightProbability(self, n: int, k: int, row: int, column: int) -> float:
        dp = [[[0] * n for i in range(n)] for i in range(k+1)]
        for step in range(k+1):
            for i in range(n):
                for j in range(n):
                    if step == 0:
                        dp[step][i][j] = 1
                    else:
                        for di, dj in ((-2, -1), (-2, 1), (2, -1), (2, 1), (1, -2), (1, 2), (-1, -2), (-1, 2)):
                            ni, nj = i+di, j+dj
                            if 0 <= ni < n and 0 <= nj < n:
                                dp[step][i][j] += dp[step-1][ni][nj] / 8
        return dp[k][row][column]
Java实现
class Solution {
    static int[][] dirs = {{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}};

    public double knightProbability(int n, int k, int row, int column) {
        double[][][] dp = new double[k + 1][n][n];
        for (int step = 0; step <= k; step++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (step == 0) {
                        dp[step][i][j] = 1;
                    } else {
                        for (int[] dir : dirs) {
                            int ni = i + dir[0], nj = j + dir[1];
                            if (ni >= 0 && ni < n && nj >= 0 && nj < n) {
                                dp[step][i][j] += dp[step - 1][ni][nj] / 8;
                            }
                        }
                    }
                }
            }
        }
        return dp[k][row][column];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值