【问题标题】:Maximum number of elements in the path of a matrix矩阵路径中的最大元素数
【发布时间】:2015-10-25 07:25:37
【问题描述】:

我尝试使用 python 解决地图(矩阵 4x4)的问题。

如果下一个节点必须小于前一个节点以及矩阵中所有可能的元素组合,我想找到地图路径中的最大元素数。

4 8 7 3  
2 5 9 3  
6 3 2 5  
4 4 1 6  

移动就像从一个元素可以移动到东西南北

例如从 m[0][1] 可以移动到 m[0][2] 和 m[1][1] 4-> 8 或 2

这是示例代码,但我不知道如何递归检查每个元素。

#import itertools
n = 4 
matrix = [[4, 8, 7, 3 ], [2, 5, 9, 3 ], [6, 3, 2, 5 ], [4, 4, 1, 6]]
for index,ele in enumerate(matrix):
    vals=[]
    for i2,e2 in enumerate(ele):
        for index2,ele2 in enumerate(ele):
            if index < (n-1):
                if ele2 > matrix[index+1] [index2]:
                    vals.append(matrix[index+1] [index2])
            if index > 0:
                if ele2 > matrix[index-1] [index2]:
                    vals.append(matrix[index-1] [index2])
            if index2 < n-1:
                if ele2 > matrix[index] [index2+1]:
                    vals.append(matrix[index] [index2+1])
            if index2 >0:
                if ele2 > matrix[index] [index2-1]:
                    vals.append(matrix[index] [index2-1])

如何递归这个函数循环到最后

例如,答案将类似于 8-5-3-2-1(具有递减因子的最长路径)

【问题讨论】:

  • 最大深度是什么意思?请说明您想要的输出。
  • 8-5-3-2-1 是最长的路径
  • @Anachor 我想这是关于在方形(或矩形)板上寻找最长的路径,这会导致(严格)递减的数字序列。但这只是一个猜测......
  • @CiaPan 是的,你是对的
  • 所以在问题中说明。还要尝试在标题中指出问题的性质,因为“矩阵的深度”并不能说明您正在解决的具体问题。

标签: python recursion matrix longest-path


【解决方案1】:

试试这个递归:从元素(x, y) 开始的最长路径是最长从其任何严格较小的邻居开始的最长路径加上 1。

def longest_path(matrix):
    def inner_longest_path(x, y):
        best, best_path = 0, []
        # for all possible neighbor cells...
        for dx, dy in ((+1, 0), (-1, 0), (0, +1), (0, -1)):
            # if cell is valid and strictly smaller...
            if (0 <= x + dx < len(matrix) and 0 <= y + dy < len(matrix[x]) 
                    and matrix[x+dx][y+dy] < matrix[x][y]):
                n, path = inner_longest_path(x+dx, y+dy)
                # check if the path starting at that cell is better
                if n > best:
                    best, best_path = n, path
        return best + 1, [matrix[x][y]] + best_path

    return max(inner_longest_path(x, y) for x, row in enumerate(matrix) 
                                        for y, _ in enumerate(row))

请注意,这会进行大量重复计算。添加记忆作为练习留给读者。

例子:

>>> longest_path(matrix)
(5, [9, 5, 3, 2, 1])

【讨论】:

    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 2018-05-26
    • 2014-04-08
    • 1970-01-01
    • 2014-08-02
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多