2023-09-27:用 go 语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0
2023-09-27:用 go 语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,
并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0),
右下单元格是 (n - 1, n - 1),象棋骑士有 8 种可能的走法,
每次移动在基本方向上是两个单元格,然后在正交方向上是一个单元格,类似马走日,
每次骑士要移动时,它都会随机从 8 种可能的移动中选择一种(即使棋子会离开棋盘),然后移动到那里。
骑士继续移动,直到它走了 k 步或离开了棋盘。
返回 骑士在棋盘停止移动后仍留在棋盘上的概率。
输入: n = 3, k = 2, row = 0, column = 0。
输出: 0.0625。
来自左程云。
答案 2023-09-27:
这段代码实现了一个求解国际象棋棋盘上骑士留在棋盘上的概率的函数。函数knightProbability
接收四个参数:n
表示棋盘大小,k
表示骑士的移动次数,row
和column
表示骑士的初始位置。
主要的函数是process2
,它使用动态规划的思想来求解。首先,根据当前位置和剩余移动次数,计算出骑士在当前位置的概率。如果当前位置已经计算过,则直接返回之前的结果。否则,根据题目要求,将当前位置向 8 个可能的方向移动,并将每个方向的概率除以 8,然后递归计算骑士在下一步位置的概率,并将所有可能的结果相加得到当前位置的概率。最后,将计算的结果记录在 dp 数组中,以便之后的计算可以直接使用。
在主函数中,给定了初始参数 n=3,k=2,row=0,column=0,然后调用knightProbability
函数计算骑士停止移动后留在棋盘上的概率,并将结果打印出来。
总的时间复杂度:由于每个位置最多计算一次,而每个位置的计算需要遍历所有剩余移动次数,所以总的时间复杂度为 O(n^2 * k)。
总的额外空间复杂度:dp 数组的大小为 nnk,所以总的额外空间复杂度为 O(n^2 * k)。
go 完整代码如下:
rust 完整代码如下:
c++完整代码如下:
c 完整代码如下:
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/7a1ba4f30d1ba8e1e6d240881】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论