【发布时间】:2021-03-28 13:04:13
【问题描述】:
我正在尝试通过我的二维数组找到特定路径
我的数组可能如下所示:
temp = [
["placeholder", 2, 0],
["placeholder", 1, 7, 3],
["placeholder", 4, 5, 8],
["placeholder", 6, 3, 5, 2],
["placeholder", 7],
["placeholder", 3, 0],
]
内部数组包含一个占位符,后跟可变数量的整数。这些整数的取值范围在 0-19 之间(包括 0 和 19)
我想通过这些内部数组找到一条从上到下的路径,其中没有多次使用数字。
在temp[0] 我可以选择我的第一个值2 或0
在temp[1],我可以选择我的第二个值1、7 或3
在temp[2],我可以选择我的第三个值4、5 或8
在temp[3],我可以选择我的第四个值6、3、5 或2
请注意,如果我在第一步中已经选择了2,则在此步骤中我无法选择2
如果我已经在第二步中选择了 3,我将无法选择 3
如果我已经在第三步中选择了 5,我将无法选择 5
等等
以下是一些合法途径:
- 2-1-4-6-7-3
- 0-1-4-5-7-3
这些是一些非法路径:
- 2-1-4-2-7-3(2被触摸两次)
- 0-1-4-5-7-0(0 被触摸两次)
我希望我的函数输出一条完全合法的路径。
如果找不到路径,我只想让我的函数返回 false。
我已经尝试编写自己的递归解决方案来解决这个问题,我认为这很有效,但是效率非常低,因此需要很长时间才能完成。
我想要的数组的大小更像是 20 x 1..20
到目前为止,我的代码看起来像这样(用 Python 3 编写)(并带有一个临时数组):
temp= [
["placeholder", 7, 3],
["placeholder", 3, 3],
["placeholder", 4, 3],
["placeholder", 3, 8],
["placeholder", 1, 3],
]
def findpath(array, path = []):
if path and path.count(path[-1]) > 1:
return False
if len(path) == len(array):
print(path)
return True
routes = array[len(path)][1:]
for route in routes:
path.append(route)
if findpath(array, path):
return True
path.pop(-1)
findpath(temp)
此代码打印:[7, 3, 4, 8, 1]
这种方法是对所有可能性进行暴力破解,直到找到解决方案。在最坏的情况下,我的temp 数组将包含 20 个数组,每个数组都包含 20 个值,即 20 个!可能的解决方案,或者换句话说 2.432.902.008.176.640.000 可能的路径。让我们夸大一下,说我的电脑需要 1 毫秒来处理这个函数的单次迭代。我的数学可能是错误的,但这意味着这个过程可能需要 77,146,816.6 年才能完成(不考虑闰年),老实说,我没有这个时间。
必须有更聪明的方法来解决这个问题。
我注意到的一件事是,如果函数在步骤中遇到内部数组,例如15,仅包含一个 int 例如2,然后该函数将尝试一次调整其最新选择(第一步 14 然后第 13 步),而没有意识到它已经在第 2 步选择了2。在这种情况下,返回第 2 步并更改从2 到其他值的值将节省大量迭代。唯一的问题是我不知道如何实现它,也不知道如何进一步优化它。
这是一个真实的示例数组(不确定它是否包含解决方案)
temp = [
['placeholder', 2, 6, 11, 14, 15, 16, 18],
['placeholder', 2, 6, 7, 10, 11, 14, 15, 16, 17, 18, 19],
['placeholder', 2, 6, 10, 11, 14, 15, 16, 18, 19],
['placeholder', 2, 6, 11, 14, 15, 16, 18, 19],
['placeholder', 2, 6, 11, 14, 15, 16],
['placeholder', 2, 6, 7, 10, 11, 14, 15, 16, 18, 19],
['placeholder', 2, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19],
['placeholder', 11, 15, 16],
['placeholder', 11, 14, 15, 16],
['placeholder', 0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 11, 15],
['placeholder', 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 2, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 15],
['placeholder', 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
['placeholder', 2, 11, 14, 15, 16],
['placeholder', 2, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19]
]
希望你能帮助我学习
【问题讨论】:
-
您能否阐明从一行到下一行和列的有效“移动”是什么?如果没有有效路径,输出是什么?
-
我已经编辑了这篇文章,希望这更有意义:)
-
非常感谢,我看看
-
@pluto9800 在看到您的真实输入示例后,我对我的帖子进行了一些编辑。如果您对我的帖子有任何疑问,我很乐意提供帮助:D
-
非常感谢您的时间和精力。我现在会浏览你的帖子,如果我需要进一步的帮助,请务必告诉你:)
标签: arrays python-3.x recursion