688. “马”在棋盘上的概率

————————————————————————————————————————————
已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。

现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。

现在 “马” 每一步都从可选的位置(包括棋盘外部的)中独立随机地选择一个进行移动,直到移动了 K 次或跳到了棋盘外面。

求移动结束后,“马” 仍留在棋盘上的概率。

示例:

输入: 3, 2, 0, 0
输出: 0.0625
解释:
输入的数据依次为 N, K, r, c
第 1 步时,有且只有 2 种走法令 “马” 可以留在棋盘上(跳到(1,2)或(2,1))。对于以上的两种情况,各自在第2步均有且只有2种走法令 “马” 仍然留在棋盘上。
所以 “马” 在结束后仍在棋盘上的概率为 0.0625。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/knight-probability-in-chessboard
————————————————————————————————————————————
解题思路:使用动态规划,创建一个三维数组d[i][j][k],其中dp[i][j][k]表示棋盘位置为j行k列的旗子经过i步后在棋盘上的概率。每一步,棋子共有八种走法,创建一个二维数组,保存这八个走法,每次循环这八步。对于某个点的八个走法中的任意一个,将该点的位置加上八个走法中的值,得到另外一个位置,用1/8 乘于另外位置上一步得到的棋子位于棋盘上的概率。其C++代码如下:

class Solution {
public:double knightProbability(int n, int k, int r, int c) {vector<vector<vector<double>>> dp(k+1,vector<vector<double>>(n,vector<double>(n,1.0)));  #创建一个三维数组int buzhou[8][2] = {{1,2},{1,-2},{2,1},{2,-1},{-2,1},{-2,-1},{-1,2},{-1,-2}};  #八个走法的二维数组for(int i=1;i<=k;i++)   #棋子一共走k步{for(int j=0;j<n;j++)  #循环棋盘上的n行{for(int l=0;l<n;l++)  #循环棋盘上的n列{double num = 0;   #用于存储当前棋子下一步仍然在棋盘上的概率for(int m=0;m<8;m++){int x = j + buzhou[m][0];  #当前棋子下一步的位置int y = l + buzhou[m][1];  #当前棋子下一步的位置if((x<0)||(y<0)||(x>=n)||(y>=n))    #如果下一步位置在棋盘外,则不统计其概率值continue;else   #如果下一步棋子位置在棋盘上,则有以下计算概率公式num = num + 1.0/8.0 * dp[i-1][x][y]; }dp[i][j][l] = num;  #将棋子经过i步后在棋盘上的概率存储在dp中}}}return dp[k][r][c];  #返回位于[r,c]位置的棋子经过k步后在棋盘上的概率}
};

leetcode - 688. “马”在棋盘上的概率相关推荐

  1. LeetCode 688. “马”在棋盘上的概率

    688. "马"在棋盘上的概率 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始.即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1). 现有 ...

  2. LeetCode 688. “马”在棋盘上的概率(DP)

    文章目录 1. 题目 2. 解题 1. 题目 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始.即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1). 现有一个 ...

  3. leetcode 688. Knight Probability in Chessboard | 688. “马”在棋盘上的概率(dp,记忆化搜索)

    题目 https://leetcode.com/problems/knight-probability-in-chessboard/ 题解 左神讲过类似问题: 给定5个参数,N,M,row,col,k ...

  4. 【精】LintCode领扣算法问题答案:1084. “马”在棋盘上的概率

    1084. "马"在棋盘上的概率 描述 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始.即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1) ...

  5. LeetCode第688题 骑士在棋盘上的概率

    LeetCode第688题 骑士在棋盘上的概率 题目 在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,并尝试进行 k 次移动.行和列是 从 0 开始 的,所以 ...

  6. Leetcode 688.Knight Probability in Chessboard

    Leetcode 688.Knight Probability in Chessboard 题目: On an NxN chessboard, a knight starts at the r-th ...

  7. 【LeetCode】1227. 飞机座位分配概率

    一.题目描述 有 n 位乘客即将登机,飞机正好有 n 个座位.第一位乘客的票丢了,他随便选了一个座位坐下. 剩下的乘客将会: 如果他们自己的座位还空着,就坐到自己的座位上, 当他们自己的座位被占用时, ...

  8. leetcode算法题--骑士在棋盘上的概率★

    原题链接:https://leetcode-cn.com/problems/knight-probability-in-chessboard/ 动态规划,这种题目的想法都是逆向思维,题目问从一个点出发 ...

  9. LeetCode 382. 链表随机节点(概率)

    1. 题目 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶: 如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? 来源:力扣( ...

最新文章

  1. 国内最火的五款HTML5前端开发框架
  2. 基于springboot实现高校学生健康档案管理系统
  3. 7分钟分析人类全基因组,他们刷新全球纪录,此前最快也要24小时
  4. 解决AttributeError: 'module' object has no attribute 'main' 安装第三方包报错
  5. 让线程等待10秒_把python程序变成多线程
  6. ecplise git修改提交信息_eclipse git提交忽略文件配置
  7. python核心编程:第六章。
  8. vue3新增Teleport组件
  9. 如何动态的修改隐藏域,让它实现添加,又可以实现修改操作
  10. ArcPad 10 使用与同步 ArcGIS Server 的数据全攻略(二)
  11. docx文档文字怎么加边框_Word技巧:怎么给文本加方框
  12. Django--表单
  13. 2022秋软工实践 团队展示与选题报告
  14. 《聪明人用方格笔记本》读书笔记
  15. pmp复习资料链接-2021.06.20考试(中培)
  16. pytest 测试框架学习(14):pytest.warns
  17. 加js库和css库| jQuery hover()用法 |document.onreadystatechange |get和post
  18. 本周 GitHub 速览:自动化当道,破密、爬虫各凭本事
  19. 怎样在苹果Mac上显示或隐藏“节假日”日历?
  20. 绘制原理图时的常识(一)Stm32F103ZE电源供电

热门文章

  1. 在 npm script 中使用环境变量
  2. 容器编排技术 -- Init 容器
  3. Linux用一键安装包快速部署禅道项目管理平台
  4. Docker快速搭建Tuleap项目管理平台
  5. Debian/Ubuntu系统下,apt-get update 、apt-get upgrade 、apt-get dist-upgrade 命令之间的区别
  6. Linux如何建立用户(组)及调整用户(组)属性(案列+详细指令)
  7. jmeter重写java请求_jmeter之编写java请求-扩展Java Sampler
  8. 【WPF学习】第五十章 故事板
  9. 使用 XAML 格式化工具:XAML Styler
  10. [watchtower] 自动更新 Docker 镜像与容器