根据列表中某个数字的位置在排列列表中查找数字

2024-04-27 17:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在编写一个程序来解决一个有特定条件的数学问题。你知道吗

这道数学题有七个格。开始时,前三个插槽被数字1、2和3占用。中间有一个空槽。接下来的三个是数字4、5和6。一共七个插槽。你知道吗

问题的目标是让12和3与45和6互换位置。一次只能移动一个号码。它可以将另一个数字移到一个空插槽(零)中,也可以用一个空插槽横向切换。你知道吗

下面是一个开始的形象:

1 2 3 0 4 5 6


预期结果如下:

4 5 6 0 1 2 3


请记住,它不一定是按这个顺序排列的,只要一个边上有4个5和1个,2个3在另一个中间,0个中间有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)

提前谢谢。任何帮助都将不胜感激!你知道吗


Tags: import程序true列表timevalue数字数学
1条回答
网友
1楼 · 发布于 2024-04-27 17:20:11

以下是一些关于你的计划的高级建议。我假设在每一次移动中,零将与一个距离零一个或两个槽的数字交换位置。我还假设您希望找到从初始列表到“期望结果”的最小移动次数,并且打印输出将显示从起始位置到期望结果的所有位置。你知道吗

如果你懂图论(也叫网络论),你可以很容易地解决你的问题,从你的起始位置到任何想要的位置进行广度优先搜索。图中的节点是5040个可能的排列,如果可以在一次移动中从一个位置移动到另一个位置,则两个节点之间有一条边。你知道吗

如果你不懂图论,你可以用下面的方法。您可以使用两种总体数据结构:队列(如collections.deque)和字典。将初始位置放入队列。同时将其作为值为None的字典中的键。你知道吗

然后运行循环。在循环的每次运行中,从队列中移除一个位置。从这个位置最多有四种可能的移动:将零与零的2左、1左、1右或2右项交换。(如果零位于或接近末端,可能的移动次数将更少。)对于这些移动中的每一个,如果产生的位置不在字典中,则将其添加到队列和字典中。字典条目的值是您刚从队列中获取的位置。如果结果位置已经在字典中,则不执行任何操作。你知道吗

现在检查结果位置是否为“期望结果”。如果没有,继续循环。如果是,请使用字典将所有移动从所需结果保存回初始位置。然后按所需顺序打印这些位置,就完成了打破循环。你知道吗

注意这个方法的三点。首先,如果任何移动序列达到所需的结果,这种方法将打印最短的序列之一。第二,并不是所有的原始位置的排列都被生成。一次生成一个置换,直到达到所需的结果为止,不需要更多的置换。第三,在所有的动作都完成并挑选出好的动作之前,不进行印刷。这是因为大多数的行动都不会被证明是有用的,所以我们要等到知道哪些是有用的。你知道吗

如果你想要更多的信息,展示你自己的作品。但在那之前,告诉我我是否正确理解了你问题的规则。你知道吗

相关问题 更多 >