我正在尝试制作一个Rubik's Cube Scrambler,它会打印一系列随机动作来打乱我的立方体。但是,有时我的程序会打印出两个相互抵消的动作。如何避免这种情况?
这是我到目前为止所拥有的:
#include<stdio.h>
int main()
{
int st[] ={1,2,3,4,5,6,7,8,0};
int i;
for(i=0; st[i]; i++)
printf("\n%d %d %d %d", str[i], *(str+i), *(i+str), i[str]);
return 0;
}
对不起,如果我的代码不好。我才刚开始。
答案 0 :(得分:0)
将最后一个动作分配给循环外的变量,并与最后一个动作进行比较。如果它们抵消了,则生成一个新的,然后再次进行比较。
类似这样的东西(假设我正确理解了您的“动作”):
import random
scramble_length = random.randint(9,24)
move_list = ["U","U'","D","D'","B","B'","F","F'","L","L'","R","R'"]
varHold =""
for x in range(scramble_length):
varNew = random.choice(move_list)
B_DontContinue = True
while (B_DontContinue):
B_DontContinue = False
if varHold == "U" and varNew == "U'":
B_DontContinue=True
elif varHold == "D" and varNew == "D'":
B_DontContinue = True
elif varHold == "R" and varNew =="R'":
B_DontContinue = True
elif varHold == "L" and varNew == "L'":
B_DontContinue = True
elif varHold == "B" and varNew == "B'":
B_DontContinue = True
elif varHold == "F'" and varNew == "F'":
B_DontContinue = True
print(random.choice(move_list))
答案 1 :(得分:0)
我可以想到几种不同的方法来解决这个问题。
您可以从列表中删除所有'
条移动。您的多维数据集就像在同一方向上被随机的转弯序列所扰乱一样。仍然有很小的可能性,即连续四次相同的动作彼此抵消,但这比连续两次相反的动作的可能性小得多。
生成动作列表之后,连续扫描要取消的两个动作,然后替换其中一个(或随机排列列表)。继续这样做,直到没有任何取消动作对。
答案 2 :(得分:0)
您可以使用差值从可能的动作中删除最后一个动作的反面,然后再传递给random.choice
:
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
答案 3 :(得分:0)
而不是将其作为评论。
多维数据集映射结构:
1-多维数据集的每一侧有九个图块,其中行(R)为三,列的(C)为三。
2-从左到右,每列编号为1,2或3。行的同上。
3-示例“ UC1”代表以下指令:“移动列1”>“向上”。
因此,如果您引入坐标,则会得到例如字符串:
[“ UC1”,“ DR2”,“ UC2'”,“ DC3”,“ U1C”,RR1]。
此处RR1 =“将第1行移至>向右”。
因此,将您的更改添加到最终的映射结构中,而彼此之间完全相同的完全相同的取消动作会大大降低。而且,如果您的移动次数可以除以4,则您可能最终会使一个图块再次位于同一位置,但是其他两个图块(列或行)都不相同,而与图块的颜色无关。
请注意,就像让安提到的那样,您需要记住最后一步(last_move = [方向,行/列,行/列号])。
要为; p编码的许多变量