魔方加扰算法 - JavaScript



我一直在研究魔方计时器网站,我需要制作一个加扰算法。我将介绍加扰算法应该如何工作: 每张脸都有自己的字母,它是首字母。对于检查,如果你想移动正面,你会写"F"。如果要移动右面,可以写"R",依此类推。请注意,底面是D,至于向下。所以你有D U R L B F。 如果该字母后面没有任何内容,则顺时针转动它。如果有撇号"'",则逆时针旋转。如果有 2,则转动两次。现在的问题是,您不能将 2 个相同的字母彼此相邻,因为它们会取消(例如"..呃呃..."与什么都不做是一样的。到目前为止,我已经在我的算法中处理了这个问题。 当你有一个字母时,问题就来了,然后它是相反的,然后又是第一个字母,(例如"..呃呃..."(意味着顺时针向上,顺时针向下,逆时针向上))。 我不知道如何检查这些并自动避免它们。代码如下:

<div id=“Scramble”></div>
<script>
generateScramble();
function generateScramble() {
// Possible Letters
var array = new Array(" U", " D", " R", " L", " F", " B")
// Possible switches
var switches = ["", "'", "2"]; 
var array2 = new Array(); // The Scramble.
var last = ''; // Last used letter
var random = 0;
for (var i = 0; i < 20; i++) {
// the following loop runs until the last one 
// letter is another of the new one
do {
random = Math.floor(Math.random() * array.length);
} while (last == array[random]) 
// assigns the new one as the last one
last = array[random];
// the scramble item is the letter
// with (or without) a switch
var scrambleItem = array[random] + switches[parseInt(Math.random()*switches.length)];
array2.push(scrambleItem); // Get letters in random order in the array.
}
var scramble = "Scramble: ";
// Appends all scramble items to scramble variable
for(i=0; i<20; i++) {
scramble += array2[i];
}
document.getElementById("Scramble").innerHTML = scramble; // Display the scramble
}
</script>

首先,魔方的上帝数字是 20;s立方体,所以你只有20个动作而不是25个。我假设您没有进行加扰(如标题所示),而是为 genere&test 求解器类型生成解决方案命令字符串。有太多的序列相互抵消,检查所有序列很可能比实际尝试它们慢。

问题是即使O(n^20)也很大,你需要降低20.这是通过LUT保持半求解状态来完成的。例如,为 5 圈加扰的所有组合创建表保持状态。然后使用它作为最终条件,将您的求解器变成O(n^15 + n^5) = O(n^15)...

相关内容

  • 没有找到相关文章

最新更新