【发布时间】:2013-01-20 14:29:41
【问题描述】:
我一直在研究使用 Haskell 的抽象国际象棋算法(试图扩展我对不同范式的理解),并且遇到了一个我已经思考了数周的挑战。
问题来了:
给定一个棋盘(由整数列表表示;每个 整数表示后续点值),维度为 n x n, 确定提供最多点的路径。如果有领带 要获得最佳路径,请返回其中任何一个。
具体如下:
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 点正方形)。这将产生元组([1,2,3,4], 29)。
记住,这一切都在 Haskell 中,所以这是一个函数范式递归问题。一开始我在想用贪心算法,也就是选择r1中的最大值,然后通过比较接下来的3种可能性进行递归;选择 3 个中的最高值。但是,缺点是贪心算法没有能力在下一行之前看到潜力。
我该怎么做呢?我不是在寻找代码本身,因为我喜欢自己解决问题。但是,非常感谢伪代码或一些算法指导!
【问题讨论】:
-
这可以使用 Dijkstras 算法的改编来完成吗?数字是图的节点,每个节点的值将是指向它的每条边的权重,而不是与较短的路径进行比较,我们可以与较长的路径进行比较。
-
显然直觉对于一般情况是错误的,因为最长路径问题在一般图中是 NP-hard(例如参见 stackoverflow.com/questions/10462736/…)。但是(!),您的问题相当于在有向无环(!)图中找到最长的路径,最长和最短路径都可以通过在节点的拓扑顺序中找到最长/最短路径来计算。
标签: algorithm haskell optimization recursion greedy