我尝试使用python解决map(matrix 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(具有递减因子的最长路径)
答案 0 :(得分: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])