对于学校作业,我们需要在C#中实施7步法算法方法,该方法可以使Rubik's Cube的面孔变乱。不幸的是,网络上没有足够的资源显示应如何编码。我已经实现了秒表来计算不同魔方尺寸所花费的滴答声。
此代码适用于混洗位,但是花费的时间似乎没有意义,因为它比Fisher Yates的速度更快。
Random rand = new Random();
for (int i = rubikCubeArray.Length - 1; i > 7; i--)
{
int n = rand.Next(i + 1);
int temp = rubikCubeArray[i];
rubikCubeArray[i] = rubikCubeArray[n];
rubikCubeArray[n] = temp;
}
有帮助吗?
常用起始种子是个好主意(如jdweng指出)
我只需要修复打字错误,因为菜鸟可能不知道seen
应该是seed
。这样,两个比较的算法将具有相同的条件。
嵌套循环
不熟悉7-Riffle Shuffle算法,但回溯求解器应嵌套有for循环。现在,您的单循环运行了9次(为什么?)。
如果您有N=7
匝洗牌的多维数据集,则您需要7个嵌套的for循环,每个循环在所有可能的匝3*3*2=18
上进行迭代。如果N
正在更改,则需要动态嵌套for循环以获取更多信息,请参阅:
每次迭代中的每个for循环都通过选定的移动来转换先前的循环状态立方体,并且在最后一个循环中还应检测已解决的情况并在发现中断的情况下中断。
所以像这样:
nested_for
[cube0=solved_cube();
for (cube1=cube0;i1=0;i1<18;i1++,cube1=turn_cube(cube0,i1))
for (cube2=cube1;i2=0;i2<18;i2++,cube2=turn_cube(cube1,i2))
...
for (cube7=cube6;i7=0;i7<18;i7++,cube7=turn_cube(cube1,i7))
if (cube7 == solved_cube()) return { i1,i2,...,i7 }; // solution found
return false; // unsolved
将返回由turn_cube(cube a,int turn)
转向的立方体a
,其中turn
选择朝哪个方向旋转的切片...
这也可能使您感兴趣:
turn