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

题目

在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0) ,右下单元格是 (n - 1, n - 1) 。
象棋骑士有8种可能的走法,如下图所示。每次移动在基本方向上是两个单元格,然后在正交方向上是一个单元格。
每次骑士要移动时,它都会随机从8种可能的移动中选择一种(即使棋子会离开棋盘),然后移动到那里。
骑士继续移动,直到它走了 k 步或离开了棋盘。
返回 骑士在棋盘停止移动后仍留在棋盘上的概率 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/knight-probability-in-chessboard
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案

答案一(动态规划)

class Solution {/*** 主体逻辑:*  对整个棋盘进行遍历,遍历每次结果的概率* @param n* @param k* @param row* @param column* @return*/public double knightProbability(int n, int k, int row, int column) {if(!inBoard(row, column, n)){return 0.0;}if(k==0){return 1.0;}// 记录每一步共有多少情况int[] xs = new int[]{-2,-1,1,2,2,1,-1,-2};int[] ys = new int[]{-1,-2,-2,-1,1,2,2,1};//用于存储走了多少步后的状态double[][] begin = new double[n][n];double[][] after = new double[n][n];for (int i = 0; i < begin.length; i++) {for (int j = 0; j < begin.length; j++) {begin[i][j] = 1.0;}}for (int i = 0; i < k; i++) {for (int j = 0; j < begin.length; j++) {for (int l = 0; l < begin[j].length; l++) {double num = 0;for (int q = 0; q < xs.length; q++) {int xNum = j + xs[q];int yNum = l + ys[q];if(inBoard(xNum, yNum, n)){num += begin[xNum][yNum];}}after[j][l] = num / (double)xs.length;}}double[][] dou = after;after = begin;begin = dou;}return begin[row][column];}public boolean inBoard(int row, int column, int n){return row < n && row >= 0 && column < n && column >= 0;}}

初始化变量i用于记录走了几步,创建二维数组,在走了i步后,当前位置仍然在棋盘内的可能性,并且每一次的概率都与上一步后每个位置的概率有关,例如,第i步时坐标为(x,y)的点的概率为第i-1步时可以达到(x,y)位置的点的合计概率除以8(即可能的个数)。

答案一(动态规划)(相比于答案二极小幅度优化)

class Solution {/*** 主体逻辑:*  对整个棋盘进行遍历,遍历每次结果的概率* @param n* @param k* @param row* @param column* @return*/public double knightProbability(int n, int k, int row, int column) {if(!inBoard(row, column, n)){return 0.0;}if(k==0){return 1.0;}int[] xs = new int[]{-2,-1,1,2,2,1,-1,-2};int[] ys = new int[]{-1,-2,-2,-1,1,2,2,1};double[][] begin = new double[n][n];double[][] after = new double[n][n];for (int i = 0; i < begin.length; i++) {for (int j = 0; j < begin.length; j++) {begin[i][j] = 1.0;}}for (int i = 0; i < k - 1; i++) {for (int j = 0; j < begin.length; j++) {for (int l = 0; l < begin[j].length; l++) {double num = 0;for (int q = 0; q < xs.length; q++) {int xNum = j + xs[q];int yNum = l + ys[q];if(inBoard(xNum, yNum, n)){num += begin[xNum][yNum];}}after[j][l] = num / (double)xs.length;}}double[][] dou = after;after = begin;begin = dou;}double result = 0.0;for (int i = 0; i < xs.length; i++) {int x = row + xs[i];int y = column + ys[i];if(inBoard(x, y, n)){result += begin[x][y];}}return result / xs.length;}public boolean inBoard(int row, int column, int n){return row < n && row >= 0 && column < n && column >= 0;}
}

相较于答案一,在最后一次循环中我们不需要知道其他位置的答案,只需要知道我们题目中要求的位置的概率即可。因此直接跳过最后一次循环,然后直接计算(row,column)坐标的概率即可。

LeetCode第688题 骑士在棋盘上的概率相关推荐

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

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

  2. 骑士在棋盘上的概率(递归)

    这道题使用递归思想虽然代码较简洁,但会出现大量的重复计算,但还是想把这种思路展示给大家: class Solution { public://vector<int> dirs = {{-2 ...

  3. LeetCode算法刷题目录 (Java)

    目录 1.数学基础 1.1.位运算 1.2.其它 2.数据结构 2.1.线性表 2.1.1.数组(双指针) 2.1.2.链表(双指针) 2.1.3.栈 2.1.4.队列 2.1.5.字符串 2.1.6 ...

  4. Leetcode每日一题总目录(动态更新。。。)

    0. 概要 leecode每日一题(也可能多题)题解跟踪记录及总目录. 常用算法解题思路和技巧及数据结构: 预处理:数组排序(954),哈希表... 双指针法 682,125,905 单向链表 2 双 ...

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

    688. "马"在棋盘上的概率 -------------------------------------------- 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 ...

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

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

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

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

  8. leetcode算法题--骑士拨号器

    原题链接:https://leetcode-cn.com/problems/knight-dialer/ 方法一: 这题是基于"马"在棋盘上的概率,所以我们就按照"马&q ...

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

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

最新文章

  1. 一张图,看懂阿里云12年的“飞天日记”
  2. OCT检查报告-光感受器COST线缺失与黄斑前膜
  3. asp.net core 实战之 redis 负载均衡和quot;高可用quot;实现
  4. jar 打包命令详解
  5. 如何从DOS命令窗口进行复制粘贴
  6. javaSE----for,wile ,do while循环的应用
  7. easybcd添加或删除启动选项
  8. 华东师范大学2017年数学分析考研试题
  9. 三元一次方程组步骤_怎样解三元一次方程组 50道三元一次方程组计算题及答案过程...
  10. ms office excel2013教程 - 合并计算
  11. [WUSTCTF2020]level3 笔记与自省
  12. 小说作者推荐:半截白菜合集
  13. GeoJson Style
  14. 免费虚拟机软件VirtualBox快速入门
  15. 15.2. logrotate - rotates, compresses, and mails system logs
  16. 办公室绿植租赁布置方案
  17. 【嵌入式Linux应用开发】温湿度监控系统——绘制温湿度折线图
  18. 【kafka】-入门篇
  19. RTMP视频推流功能组件EasyRTMP-HIK DEMO版本运行报错0xc000007b问题排查分析
  20. 除了乔布斯,科技圈还有哪些大佬值得充信仰?

热门文章

  1. LHL'PTA 实验2. 前8章实验综合训练(2)
  2. javaWeb学习笔记1—前端三件套 HTML CSS JavaScript
  3. 【NLP学习】中文分词
  4. 运算指令——ADD、SUB、MUL、DIV
  5. 微信小程序做类似vue的级联选择功能,使用picker-view-column+checkbox-group完成
  6. 开机蓝屏stop 0x00000ed 解决办法
  7. OpenStack Swift Account Reaper
  8. 树莓派不进入系统,一直重启现象
  9. c#调用.bat程序执行bat文件
  10. 学而时习之(2):单边sar adc测热电偶温度