【发布时间】:2018-05-23 19:25:19
【问题描述】:
我目前正在研究网络计时器,但我的加扰算法算法存在一些问题。由于它是第一个版本,我只希望扰码器是随机移动而不是随机状态,因为它制作起来太复杂了,它将在未来的更新中推出。我有一个算法,它基本上会从可能性中选择一组随机移动,然后检查两个相同的字母(或移动)是否不相邻。一切正常,但我不知道如何添加一些可以避免以下情况的内容:例如“D U D”。两个相同的动作被另一个动作分开是可以接受的,例如“D R D”,但不是“D U D”,因为它等于“D2 U”,因此是一个浪费的动作。
来自非立方体的信息:
每个字母代表它的脸,当它被阅读时,它会被移动。例如:“L U L”:“L”表示左脸顺时针旋转一次,“U”表示上脸顺时针旋转,最后“L”再次表示左脸再次旋转。 如果一个字母后跟一个撇号,则表示该面应逆时针旋转。如果后面跟着一个“2”,则表示脸要连续旋转两次。 L是左,R是右,F是前,B是后,D是下,U是上
代码如下:
function generate_scramble() {
var scramble_length = 20;
var scramble = new Array();
var possible_letters = new Array(" D", " U", " B", " F", " R", " L");
var possible_switches = new Array("", "2", "'");
var array_of_randoms = new Array();
for (var i = 0; i < scramble_length; i++) {
var random_letters = Math.floor(Math.random() * possible_letters.length);
var random_switches = Math.floor(Math.random() * possible_switches.length);
array_of_randoms.push(random_letters);
if (array_of_randoms[array_of_randoms.length - 1] == array_of_randoms[array_of_randoms.length - 2]) {
if (array_of_randoms[array_of_randoms.length - 1] < 5) {
array_of_randoms[array_of_randoms.length - 1]++;
} else {
array_of_randoms[array_of_randoms.length - 1]--;
}
}
random_letters = array_of_randoms[array_of_randoms.length - 1];
scramble.push(possible_letters[random_letters] + possible_switches[random_switches])
}
document.getElementById("scramble").innerHTML = "Scramble: " + scramble.join("");
}
generate_scramble();
<p id="scramble">
Scramble:
</p>
<button onclick="generate_scramble()">
New Scramble
</button>
【问题讨论】:
-
你能列出更多的虚假案例吗?很难知道什么时候会失败
-
应避免的情况:D U D, U D U, L R L, R L R, F B F, B F B
-
我写的没有撇号,也没有两个。但他们基本上可以在任何地方,这不会改变任何事情
-
所以 B F B2 或 B F2 B 可以,但 B2 F B2 不行?
-
好吧,没有一个可以。确实 B2 F B2 会完全取消 B 的动作,所以它会是最坏的,但是例如 BF B2 会等于 B' F,或者 B F2 B 会等于 B2 F2,所以它会浪费一个移动。我所说的“浪费一步”的意思是,一个骗局算法通常只有 20 步长,如果我用 3 步来做某事,但可以用 2 步来完成,它只会浪费一个槽,一个空间左右,在这些20 步
标签: javascript algorithm rubiks-cube