根据列表中数字之一的位置在排列列表中查找数字

时间:2018-11-21 02:23:05

标签: python list math permutation itertools

我一直在编写一个程序,可以解决特定条件下的数学问题。

在这个数学问题中,有七个插槽。首先,前三个插槽被数字1、2和3占用。中间有一个空插槽。接下来的三个是数字4、5和6。总共七个插槽。

问题的目标是将1 2和3与4 5和6交换位置。一次只能移动一个数字。它可以将另一个数字移到一个空插槽(零)中,也可以在一个空插槽上横向移动。

以下是起点的可视化视图:

1 2 3 0 4 5 6


所需结果如下所示:

4 5 6 0 1 2 3


请记住,只要一侧是4 5 6而另一侧是1 2 3且中间是0,则不必按此顺序。

我们正在创建的程序将itertools用于排列列表。然后,根据零的位置,找到适合下一个动作的排列。

我需要的是根据组合中零的位置从此列表中提取(输出)特定组合。下面是到目前为止的代码。

import time
import itertools

nonStop = True
answerList = [1, 2, 3, 0, 4, 5, 6]

combinations = itertools.permutations([1, 2, 3, 0, 4, 5, 6])

while nonStop == True:
    for value in combinations:
        i = 0
        print(value)
        i += 1
        time.sleep(2)

先谢谢了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

以下是您程序的一些高级建议。我假设在每次移动时零都将交换一个与零相距一或两个插槽距离的数字的位置。我还将假设您想找到从初始列表到“期望结果”的最少移动次数,并且打印输出将显示从起始位置到期望结果的所有位置。

如果您了解图论(也称为网络理论),则可以通过从起始位置到任意位置的广度优先搜索轻松地解决问题。图中的节点是5,040个可能的排列,如果您可以从一个位置转到另一个位置,则两个节点之间会有一条边。

如果您不了解图论,则可以使用以下方法。您可以使用两个整体数据结构:一个队列(例如collections.deque)和一个字典。将初始位置放入队列。还要将其作为键输入到字典中,其值为None

然后运行一个循环。在循环的每次运行中,从队列中删除一个位置。从该位置最多将有四个移动:将零与零的左边2,左边1,右边1或右边2交换。 (如果零在端点处或在端点附近,则可能的移动将更少。)对于每个移动,如果结果位置不在字典中,请将其添加到队列和字典中。字典条目的值是您刚从队列中移出的位置。如果结果位置已经在字典中,则什么也不做。

现在检查结果位置是否为“所需结果”。如果不是,请继续循环。如果是这样,请使用字典将所有动作从所需结果保存回初始位置。然后按所需顺序打印这些位置,就可以完成-中断循环。

请注意有关此方法的三件事。首先,如果任何移动顺序达到期望的结果,则此方法将打印最短的顺序之一。其次,并非生成原始位置的所有排列。一次生成一个排列,直到达到期望的结果-不需要更多。第三,在完成所有动作并且选出好的动作之前,不进行打印。这是因为大多数举动不会证明是有用的,所以我们等到知道有用的举动为止。

如果您想了解更多信息,请展示一些自己的作品。但是在此之前,请告诉我我是否正确理解了您的问题规则。

相关问题