ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

三阶半转魔方

三阶半转魔方 目录1魔方三要素1组成部件2可执行操作3目标态2复原方法1调整8个角块的位置2调整12个棱块的位置3调整角块和棱块的朝向3三阶半转魔方 VS 五阶齿轮魔方1魔方三要素1组成部件和三阶魔方类似形状参考但是颜色不要参考这个这个颜色设定不符合标准颜色排布。我在网上找不到卖三阶半转魔方的只找到外国网友自制的这个参考Takafumis Half turn cube关键就是中心块不是正方形所以每次只能旋转180度。2可执行操作和三阶魔方类似6种操作但是每次只能旋转180度。3目标态同三阶魔方2复原方法1调整8个角块的位置利用我的交换公式自动推导并采用文中的默认编号运行int main() { CubeBlock block1(0, 8);//8角块 vectorCubeBlockb vectorCubeBlock{ block1 }; Opt opt1{ { {2,3,0,1,4,5,6,7} } ,上 }; Opt opt2{ { {0,1,2,3,6,7,4,5} } ,下 }; Opt opt3{ { {0,1,7,6,4,5,3,2} } ,前 }; Opt opt4{ { {5,4,2,3,1,0,6,7} } ,后 }; Opt opt5{ { {7,1,2,4,3,5,6,0} } ,左 }; Opt opt6{ { {0,6,5,3,4,2,1,7}} ,右 }; CubeOpt op1(b, opt1); CubeOpt op2(b, opt2); CubeOpt op3(b, opt3); CubeOpt op4(b, opt4); CubeOpt op5(b, opt5); CubeOpt op6(b, opt6); vectorCubeOptopts { op1,op2,op3,op4,op5,op6 }; for (int i 0; i opts.size(); i)mans[i] opts[i].getName(); Cube cube(b, opts); cube.bfs(0, 3, 3); return 0; }运行结果只输出一行 k96也就是说不存在只有3个角块位置不对的情况。所以只需要随便把下面一层的4个角块中的3个归位那么第4个角块就一定是归位的。此时最多只需要一次旋转操作就可以恢复所有角块的位置。2调整12个棱块的位置运行int main() { CubeBlock block1(0, 8);//8角块 CubeBlock block2(1, 12);//12侧棱 vectorCubeBlockb vectorCubeBlock{ block1,block2 }; Opt opt1{ { {2,3,0,1,4,5,6,7},{2,3,0,1,4,5,6,7,8,9,10,11} } ,上 }; Opt opt2{ { {0,1,2,3,6,7,4,5},{0,1,2,3,4,5,6,7,10,11,8,9} } ,下 }; Opt opt3{ { {0,1,7,6,4,5,3,2},{0,1,10,3,4,5,7,6,8,9,2,11} } ,前 }; Opt opt4{ { {5,4,2,3,1,0,6,7},{8,1,2,3,5,4,6,7,0,9,10,11} } ,后 }; Opt opt5{ { {7,1,2,4,3,5,6,0},{0,1,2,11,7,5,6,4,8,9,10,3} } ,左 }; Opt opt6{ { {0,6,5,3,4,2,1,7},{0,9,2,3,4,6,5,7,8,1,10,11} } ,右 }; CubeOpt op1(b, opt1); CubeOpt op2(b, opt2); CubeOpt op3(b, opt3); CubeOpt op4(b, opt4); CubeOpt op5(b, opt5); CubeOpt op6(b, opt6); vectorCubeOptopts { op1,op2,op3,op4,op5,op6 }; for (int i 0; i opts.size(); i)mans[i] opts[i].getName(); Cube cube(b, opts); cube.bfs(1, 3, 3); return 0; }从运行结果中随便取一个结果0,1,2,3,7,5,4,6,8,9,10,11,0上 2前 0上 4左 0上 2前 0上 4左这个公式的效果就是4 6 7号的3个棱块轮换位置其他棱块位置不变所有角块位置不变。运行int main() { CubeBlock block1(0, 8);//8角块 CubeBlock block2(1, 12);//12侧棱 vectorCubeBlockb vectorCubeBlock{ block1,block2 }; Opt opt1{ { {2,3,0,1,4,5,6,7},{2,3,0,1,4,5,6,7,8,9,10,11} } ,上 }; Opt opt2{ { {0,1,2,3,6,7,4,5},{0,1,2,3,4,5,6,7,10,11,8,9} } ,下 }; Opt opt3{ { {0,1,7,6,4,5,3,2},{0,1,10,3,4,5,7,6,8,9,2,11} } ,前 }; Opt opt4{ { {5,4,2,3,1,0,6,7},{8,1,2,3,5,4,6,7,0,9,10,11} } ,后 }; Opt opt5{ { {7,1,2,4,3,5,6,0},{0,1,2,11,7,5,6,4,8,9,10,3} } ,左 }; Opt opt6{ { {0,6,5,3,4,2,1,7},{0,9,2,3,4,6,5,7,8,1,10,11} } ,右 }; CubeOpt op1(b, opt1); CubeOpt op2(b, opt2); CubeOpt op3(b, opt3); CubeOpt op4(b, opt4); CubeOpt op5(b, opt5); CubeOpt op6(b, opt6); vectorCubeOptopts { op1,op2,op3,op4,op5,op6 }; for (int i 0; i opts.size(); i)mans[i] opts[i].getName(); Cube cube(b, opts); cube.bfs(1, 4, 4); return 0; }从运行结果中随便取一个结果0,1,2,3,4,5,6,7,0,3,2,1,4,5,7,6,8,9,10,11,0上 2前 0上 2前 0上 2前这个公式的效果就是1号和3号互换6号和7号互换其他棱块位置不变所有角块位置不变。分析逆序数很容易证明不存在最后只有2个棱块需要互换位置的情况。所以只需要这2个公式就可以恢复所有棱块的位置。3调整角块和棱块的朝向所有角块和棱块的朝向一定是正确的不用调整。至此魔方复原。3三阶半转魔方 VS 五阶齿轮魔方五阶齿轮魔方复原角块和侧边区中棱和三阶半转魔方复原就是同一个问题。
返回列表