如何避免在这个程序中打印两个相反的内容?

2024-10-03 04:36:08 发布

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

我正在尝试制作一个魔方扰频器,它可以打印一系列随机的动作来扰频我的魔方。然而,有时我的程序会打印出两个相互抵消的动作。我怎样才能避免这种情况?你知道吗

到目前为止,我的情况是:

import random

scramble_length = random.randint(9,24)

move_list = ["U","U'","D","D'","B","B'","F","F'","L","L'","R","R'"]

for x in range(scramble_length):
    print(random.choice(move_list))

对不起,如果我的代码不是那么好。我才刚开始。你知道吗


Tags: inimport程序formove情况rangerandom
3条回答

而不是发表评论。你知道吗

立方体映射结构:

1 - There are nine tiles on each side of the cube in rows (R) of three and/or columns (C) of three.

2 - From left to right each column is numbered as 1,2 or 3. Idem for rows.

3 - The example "UC1" stands for the following instruction: "Move column 1" > "Up".


如果你引入坐标,你会得到例如字符串:

[“UC1”,“DR2”,“UC2'”,“DC3”,“U1C”,RR1]。你知道吗

此处RR1=“向右移动行1>;”。你知道吗

因此,添加映射结构,您的更改将以相同的精确取消动作结束,直接在彼此后面移动,这会大大减少。如果你的移动可以除以4,你可能会发现一个图块再次出现在同一个位置,但是其他两个图块(列或行)是不同的,而不管图块的颜色如何。你知道吗

考虑到正如Jean提到的,你需要记住最后一步(最后一步=[方向,行/列,行/列编号])。你知道吗

许多要编码的变量;p

在将可能的移动传递给random.choice之前,可以使用set difference从可能的移动中删除上一个移动的相反部分:

import random
scramble_length = random.randint(9, 24)
moves = {"U", "U'", "D", "D'", "B", "B'", "F", "F'", "L", "L'", "R", "R'"}
move = ''
for x in range(scramble_length):
    move = random.choice(tuple(moves - {move[0] if len(move) == 2 else move + "'"}))
    print(move)

样本输出:

B'
U'
D
F
B'
B'
R'
F'
R'
B'
F
D'
B'
R
B'
F
U'
D
D
U
L
U'
B

我可以想出几种不同的方法来解决这个问题。你知道吗

  1. 您可以从列表中删除所有'移动。你的立方体将被一个随机的同方向的旋转序列所扰乱。你仍然有一个很小的可能性,四个相同的移动在一行抵消对方,但这是一个小得多的概率比两个相反的移动在一行。

  2. 生成移动列表后,在一行中扫描两个取消的移动,然后替换其中一个(或洗牌列表)。一直这样做,直到你没有任何对取消的举动。

相关问题 更多 >