我一直在使用 Haskell 研究一个抽象的国际象棋算法(试图扩大我对不同范式的理解),并且我遇到了一个我已经思考了几个星期的挑战。
这是问题所在:
给定一个尺寸为 nxn 的棋盘(由整数列表表示;每个整数代表一个后续的点值),确定提供最多点的路径。如果最佳路径存在平局,则返回其中任何一个。
以下是具体情况:
A = [[5,4,3,1],[10,2,1,0],[0,1,2,0],[2,3,4,20]]
呈现为:
R1: 5 4 3 1, R2: 10 2 1 0, R3: 0 1 2 0, R4: 2 3 4 20.
规则是:
您可以从第一行的任何位置开始
您可以一次移动一个方格,可以是直线向下、左下(对角线)或右下(对角线)。
输出必须是整数元组。
第一个元素是表示列与行的列表,第二个元素是点的总数。例如。对于上面的电路板,最好的解决方案是从左上角 (5) 开始,然后沿对角线走剩余的步骤(直到 20 点正方形)。这将导致 tuple ([1,2,3,4], 29)
。
请记住,这一切都在 Haskell 中,所以它是一个函数范式递归问题。一开始我在想用贪心算法,也就是选择r1中的最大值,然后通过比较接下来的3种可能性进行递归;选择 3 中的最高值。然而,缺点是贪心算法没有能力在下一行之前看到潜力。
我该怎么办?我不是在寻找代码本身,因为我喜欢自己解决问题。但是,非常感谢伪代码或一些算法指导!