魔方´;立方体置乱算法-JavaScript

魔方´;立方体置乱算法-JavaScript,javascript,algorithm,rubiks-cube,Javascript,Algorithm,Rubiks Cube,我一直在一个魔方计时器网站上工作,我需要做一个置乱算法。我将介绍置乱算法的工作原理: 每个人脸都有自己的字母,是首字母。例如,如果你想移动正面,你会写上“F”。如果你想移动正面,你会写上“R”,以此类推。只需注意底面是D,如向下。因此你有D U R L B F。 如果该字母后面没有任何内容,则顺时针旋转。如果有一个appostrophe“'”,则逆时针旋转。如果有一个2,则将其旋转两次。现在的问题是,不能有两个相同的字母相邻,因为它们会取消(例如“.U…”这和什么都不做一样。到目前为止,我已经在

我一直在一个魔方计时器网站上工作,我需要做一个置乱算法。我将介绍置乱算法的工作原理: 每个人脸都有自己的字母,是首字母。例如,如果你想移动正面,你会写上“F”。如果你想移动正面,你会写上“R”,以此类推。只需注意底面是D,如向下。因此你有D U R L B F。 如果该字母后面没有任何内容,则顺时针旋转。如果有一个appostrophe“'”,则逆时针旋转。如果有一个2,则将其旋转两次。现在的问题是,不能有两个相同的字母相邻,因为它们会取消(例如“.U…”这和什么都不做一样。到目前为止,我已经在我的算法中考虑到了这一点。 问题是当你有一个字母,然后它是相反的,然后又是第一个字母,(例如“.udu'”(意思是顺时针向上,顺时针向下,逆时针向上))。 我不知道如何自动检查和避免这些问题。下面是代码:

<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>

生成扫描();
函数generateScramble(){
//可能的信件
变量数组=新数组(“U”、“D”、“R”、“L”、“F”、“B”)
//可能的开关
变量开关=[“”、“\”、“2”];
var array2=new Array();//加扰。
var last='';//最后使用的字母
var random=0;
对于(变量i=0;i<20;i++){
//以下循环一直运行到最后一个循环
//这封信是另一封新信
做{
random=Math.floor(Math.random()*array.length);
}while(last==数组[随机])
//将新的指定为最后一个
last=数组[随机];
//加扰项是字母
//带(或不带)开关
var scrambleItem=array[random]+switches[parseInt(Math.random()*switches.length)];
array2.push(scrambleItem);//获取数组中随机顺序的字母。
}
var scramble=“加扰:”;
//将所有加扰项追加到加扰变量
对于(i=0;i对于Rubik;s cube的初学者,因此您只进行了20次移动,而不是25次。我假设您没有进行置乱(如标题所示)而是为genere&test solver类型生成解决方案命令字符串。有太多的序列相互抵消,要检查所有序列很可能比实际试用慢


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

一种简单的方法:1)查找动作U和反向U’之间的顺序2)只有在该顺序期间面U发生变化时,该顺序才有效(易于证明,因为您知道哪些动作会改变U)如果在序列中没有改变U,则从置乱列表中删除U,U'并从列表的开头重新开始。否则,请查看列表的下一个元素——如果在到达置乱列表的末尾之前一直这样做,则只会保留有效序列…(但我相信有一种更有效的方法)谢谢你,我会试试的事实上可能不会,对不起,我解释得很糟糕。你不能有例如U D U',但没有U D U或U D U2,因为移动次数有限,(经典魔方25次),而U D U将与U 2 D相同,或者U D U2将与U’D相同。这将浪费移动,并将导致立方体混乱,而且如果在一次解算过程中发生更多次。因此,我很抱歉在开始时解释得很糟糕。lagorithm应该仍然有效,您只需模拟更多的情况。因此,对于UD..U'its{}对于U D..U'its U2 D..没有那么多的例子…我以前有20步长,但我选择了传统的WCA扰码器,它有25步,所以这就是我更改它的原因。但它是旧的JavaScript版本,所以可能是why@JakubChaloupka顺便说一句,如果你只需要一个解算器(不是最好的解决方案)你可以使用人类的算法来实现这一点。正如评论所说,向前扫描以进行反向转弯非常简单,但速度值得怀疑,并且高度依赖于实现。@JakubChaloupka那么你就不必担心重复或自欺欺人的动作……做50个随机动作,就是这样。。。