三阶魔方自动求解及动态可视化matlab代码

  • 思路与步骤
  • 总结
  • 思考
  • 参考链接
    • 源代码

第一次写博客,想总结分享下以前做过的一些有趣的东西,目的是为了回望过去与展望未来,同时为了提高自己的写作表达能力。

思路与步骤

  1. 三阶魔方有6个面,每个面有 3 × 3 3\times3 3×3小块,用一个 6 × 3 × 3 6\times3\times3 6×3×3的矩阵来保存魔方的状态;
  2. 定义4+12种魔方旋转行为:整体旋转(左右上下共4种方式AaCc),侧面(6个侧面顺逆时针旋转共12种方式LlRrUuDdFfBb),旋转可视化界面方便调试(三维小面作图fill3创建 6 × 3 × 3 = 54 6\times3\times3=54 6×3×3=54个小面对象,对象成员属性包括颜色和4个三维坐标点,定义了全局函数对小面进行绕轴旋转操作,如此可以可视化调试,确保程序是按人想法运行),旋转行为改变矩阵的状态矩阵;
  3. 定义随机打乱和逆序恢复的函数,测试确保人为给出旋转公式,魔方能正确旋转;
  4. 编写按公式恢复魔方的函数,记录恢复过程的旋转过程公式(取一个魔方一边拧一边编程,考虑所有情况)
    1):顶层拼十字:简化为4次恢复顶面棱中小块(不破坏已恢复的结果)
    2):顶层拼四角:简化为4次恢复顶面的角小块(不破坏已恢复的结果)
    第一层恢复完成,剩下可按公式恢复魔方,把第一层置底
    3):二层拼棱角:简化为4次恢复二层棱角小块(不破坏已恢复的结果)
    第二层恢复完成
    4):按公式顶层拼十字
    5):按公式顶层四角对应恢复
    6):按公式顶面同色恢复
    7):按公式顶面棱边恢复
    第三层恢复完成
  5. 编写一个公式简化的函数,如消除相邻正反操作、消除4次相同操作、3次同向旋转替换为一次反向旋转操作、不相关跳跃旋转整合等,未能考虑所有可化简的情况,还未能化简为最少旋转步数公式。时间精力有限,待以后有新思路的时候再玩。

总结

很多指令都是现查现用的,编程模块化,过程分解,编程周期较长,编完以后,整体思路清晰,但单独模块缺少注释,不好看懂,特别是手动旋转对应编程部分,时间久了容易忘记。这是2019年1月编的代码(忘记了具体参考过哪些代码了),现在整理下思路,这里三阶魔方恢复算法是普通的按公式还原算法,主要难点在于判断魔方的状态,我编程的过程中是实际拿着个魔方一边转一边进行状态观察遍历,方法比较笨,可以实现自动魔方还原,但是还原步骤较多,程序中通过增加一些函数进行了步骤的简化
function TurnManu=simplifyTurnManu(TurnManu)
但是简化结果并不彻底,需要更高级的简化函数,或高级的魔方恢复算法。

思考

如果能够用快速相机记录并识别魔方高手旋转魔方的方法,通过机器学习、聚类、迁移等思想,改善算法,数据即算法?如果没有如果,给定初始的算法,能不能让算法自己通过运行自学习,更新算法,或者产生模拟高级的数据用于机器学习?感觉这会不会是一个很好的案例?数据为王?算法为王?Alpha Zero从0开始?有人实现了吗?

参考链接

没作记录,忘了,对参考过代码的博主表示歉意,如有发现雷同的地方,欢迎提醒,以作补充。

源代码

%% 主调函数
% ---定义魔方的初始状态
face0=ones(3,3);
MFstate={face0;face0+1;face0+2;face0+3;face0+4;face0+5};
% % MFstate=faceTurn(MFstate,'r');
% % MFstate=sideTurn(MFstate,'r');
[MFstate,TurnManu]=disorganize(MFstate,10);
% DispTurnManu(TurnManu,1);
figure;pltMoFang(MFstate);
set(gcf,'color','k');axis square;axis off;view(160,30)TurnManu=simplifyTurnManu(TurnManu,0);
TurnManu0=DispTurnManu(TurnManu);
disp({'魔方打乱操作:';TurnManu0.'})% MFstate=disorganize(MFstate,TurnManu);[MFstate1,TurnManu1]=InvRecover(MFstate,TurnManu);
TurnManu0=DispTurnManu(TurnManu1);
disp({'魔方逆序恢复操作:';TurnManu0.'})
figure;pltMoFang(MFstate1);
set(gcf,'color','k');axis square;axis off;view(160,30)[MFstate,TurnManu2]=formulaRecover(MFstate);TurnManu2=simplifyTurnManu(TurnManu2,0);
TurnManu0=DispTurnManu(TurnManu2);
disp({'魔方公式恢复操作:';TurnManu0.'})
figure;pltMoFang(MFstate);
set(gcf,'color','k');axis square;axis off;view(160,30)
-----------------------------------------------------------------------------------------------------------------------------------
%% 动画显示
face0=ones(3,3);
MFstate={face0;face0+1;face0+2;face0+3;face0+4;face0+5};
limL=-4;limU=1;
close all;fig=figure; fig.Color=[1,1,1];  fig.Position=[400 200 550 600];
fig.ToolBar='none';  fig.MenuBar='none';  fig.NumberTitle='off';  fig.Name='魔方';
hds=pltMoFang(MFstate);
set(gcf,'color','k');axis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);
pause(4);
TurnManu_all=[TurnManu;TurnManu2];
for n=1:length(TurnManu_all)pause(0.00001);turnAroundP(hds,TurnManu_all(n),10,0.01,limL,limU);MFstate=disorganize(MFstate,TurnManu_all(n));hold off;hds=pltMoFang(MFstate);axis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);
end
%% 部分子函数编写
%% 公式恢复魔方
function [MFstate,TurnManu]=formulaRecover(MFstate)
TurnManu=[];%---第一层恢复%将顶层拼十字num=zeros(1,4);for n=1:4[MFstate,TnMn,num]=recoverF10(MFstate,num);TurnManu=[TurnManu;TnMn];if sum(num)==4;break;endMFstate=faceTurn(MFstate,'r');num=circshift(num,-1);TurnManu=[TurnManu;'a'];endTurnManu=[TurnManu;('- ').'];%将顶层4个角恢复,完成第一层恢复num=zeros(1,4);for n=1:4[MFstate,TnMn,num]=recoverF4(MFstate,num);TurnManu=[TurnManu;TnMn];if sum(num)==4;break;endMFstate=faceTurn(MFstate,'r');num=circshift(num,-1);TurnManu=[TurnManu;'a'];endTurnManu=[TurnManu;('- ').'];%第二层恢复 4个角恢复,完成第二层恢复[MFstate,TnMn]=disorganize(MFstate,'CC');TurnManu=[TurnManu;TnMn];num=zeros(1,4);for n=1:4[MFstate,TnMn,num]=recover2F4(MFstate,num);TurnManu=[TurnManu;TnMn];if sum(num)==4;break;endMFstate=faceTurn(MFstate,'l');num=circshift(num,-1);TurnManu=[TurnManu;'A'];endTurnManu=[TurnManu;('- ').'];%第三层公式恢复%---步骤1:顶上拼十字[MFstate,TnMn]=recover3F10(MFstate);TurnManu=[TurnManu;TnMn];TurnManu=[TurnManu;('- ').'];%---步骤2:四个角对应上[MFstate,TnMn]=recover3F4(MFstate);TurnManu=[TurnManu;TnMn];TurnManu=[TurnManu;('- ').'];%---步骤3:顶面恢复[MFstate,TnMn]=recover3Face(MFstate);TurnManu=[TurnManu;TnMn];while isempty(TnMn)==0[MFstate,TnMn]=recover3Face(MFstate);TurnManu=[TurnManu;TnMn];endTurnManu=[TurnManu;('- ').'];%---步骤4:顶棱中恢复[MFstate,TnMn]=recover3FArris(MFstate);TurnManu=[TurnManu;TnMn];while isempty(TnMn)==0[MFstate,TnMn]=recover3FArris(MFstate);TurnManu=[TurnManu;TnMn];endend
% ---定义魔方整体旋转行为---改变朝前面
% r,l,u,d 共4种行为
function MFstate=faceTurn(MFstate,manu)if manu=='r'MFstate={MFstate{5};rot90(MFstate{3},2);MFstate{1};fliplr(MFstate{4}.');rot90(MFstate{2},2);fliplr(MFstate{6}).'};elseif manu=='l'MFstate={MFstate{3};rot90(MFstate{5},2);rot90(MFstate{2},2);fliplr(MFstate{4}).';MFstate{1};fliplr(MFstate{6}.')};elseif manu=='u'MFstate={MFstate{4};MFstate{6};fliplr(MFstate{3}.');MFstate{2};fliplr(MFstate{5}).';MFstate{1}};elseif manu=='d'MFstate={MFstate{6};MFstate{4};fliplr(MFstate{3}).';MFstate{1};fliplr(MFstate{5}.');MFstate{2}};else return;end
end
----------------------------------------------------------------------------------------------------------------------------------------------------------
% ---定义一个旋转过程的函数
function turnAroundP(hds,TurnManu,stepNum,tSec,limL,limU)
if nargin==4limL=-3;limU=0;
end
if TurnManu=='a'[az,el]=view();azStep=linspace(0,-90,stepNum);for n=1:stepNumview(az+azStep(n),el);pause(tSec);endelseif TurnManu=='A'[az,el]=view();azStep=linspace(0,90,stepNum);for n=1:stepNumview(az+azStep(n),el);pause(tSec);endelseif TurnManu=='c' || TurnManu=='C'azStep=90/(stepNum+1);if TurnManu=='C'azStep=-azStep;enddirect=[1,0,0];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=1:6for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);endelseif TurnManu=='r' || TurnManu=='R'azStep=90/(stepNum+1);if TurnManu=='R'azStep=-azStep;enddirect=[1,0,0];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=3for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor k=[1,2,4,6]for kk=1:3for kkk=3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);endelseif TurnManu=='l' || TurnManu=='L'azStep=-90/(stepNum+1);if TurnManu=='L'azStep=-azStep;enddirect=[1,0,0];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=5for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor k=[1,2,4,6]for kk=1:3for kkk=1h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);endelseif TurnManu=='u' || TurnManu=='U'azStep=-90/(stepNum+1);if TurnManu=='U'azStep=-azStep;enddirect=[0,0,1];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=6for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor k=[1,3,5]for kk=1for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor k=2for kk=3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);end    elseif TurnManu=='d' || TurnManu=='D'azStep=90/(stepNum+1);if TurnManu=='D'azStep=-azStep;enddirect=[0,0,1];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=4for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor k=[1,3,5]for kk=3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor k=2for kk=1for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);end    elseif TurnManu=='f' || TurnManu=='F'azStep=-90/(stepNum+1);if TurnManu=='F'azStep=-azStep;enddirect=[0,1,0];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=1for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor kk=1:3h=hds{3}{kk,1};rotate(h,direct,azStep,origin);endfor kk=1:3h=hds{5}{kk,3};rotate(h,direct,azStep,origin);endfor kkk=1:3h=hds{4}{1,kkk};rotate(h,direct,azStep,origin);endfor kkk=1:3h=hds{6}{3,kkk};rotate(h,direct,azStep,origin);endaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);end        elseif TurnManu=='b' || TurnManu=='B'azStep=90/(stepNum+1);if TurnManu=='B'azStep=-azStep;enddirect=[0,1,0];origin=-[1.5,1.5,1.5];for n=1:stepNumfor k=2for kk=1:3for kkk=1:3h=hds{k}{kk,kkk};rotate(h,direct,azStep,origin);endendendfor kk=1:3h=hds{3}{kk,3};rotate(h,direct,azStep,origin);endfor kk=1:3h=hds{5}{kk,1};rotate(h,direct,azStep,origin);endfor kkk=1:3h=hds{4}{3,kkk};rotate(h,direct,azStep,origin);endfor kkk=1:3h=hds{6}{1,kkk};rotate(h,direct,azStep,origin);endaxis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);pause(tSec);end       endend% ---定义魔方整体旋转行为---改变朝前面
% r,l,u,d 共4种行为
function MFstate=faceTurn(MFstate,manu)if manu=='r'MFstate={MFstate{5};rot90(MFstate{3},2);MFstate{1};fliplr(MFstate{4}.');rot90(MFstate{2},2);fliplr(MFstate{6}).'};elseif manu=='l'MFstate={MFstate{3};rot90(MFstate{5},2);rot90(MFstate{2},2);fliplr(MFstate{4}).';MFstate{1};fliplr(MFstate{6}.')};elseif manu=='u'MFstate={MFstate{4};MFstate{6};fliplr(MFstate{3}.');MFstate{2};fliplr(MFstate{5}).';MFstate{1}};elseif manu=='d'MFstate={MFstate{6};MFstate{4};fliplr(MFstate{3}).';MFstate{1};fliplr(MFstate{5}.');MFstate{2}};else return;end
end% ---定义魔方侧边旋转行为(顺时针:fliplr(~.') or rot90(~,-1)逆时针:fliplr(~).'  or rot90(~,1))
% rR,lL,uU,dD,fF,bB共12种行为(可进一步定义连续2步行为:R2,L2,U2,D2,F2,B2)
function MFstate=sideTurn(MFstate,manu)if manu=='r'MFstate{3}=fliplr(MFstate{3}.');tmp=MFstate{1}(:,3);MFstate{1}(:,3)=MFstate{4}(:,3);MFstate{4}(:,3)=MFstate{2}(:,3);MFstate{2}(:,3)=MFstate{6}(:,3);MFstate{6}(:,3)=tmp;elseif manu=='R'MFstate{3}=fliplr(MFstate{3}).';tmp=MFstate{1}(:,3);MFstate{1}(:,3)=MFstate{6}(:,3);MFstate{6}(:,3)=MFstate{2}(:,3);MFstate{2}(:,3)=MFstate{4}(:,3);MFstate{4}(:,3)=tmp;elseif manu=='l'MFstate{5}=fliplr(MFstate{5}.');tmp=MFstate{1}(:,1);MFstate{1}(:,1)=MFstate{6}(:,1);MFstate{6}(:,1)=MFstate{2}(:,1);MFstate{2}(:,1)=MFstate{4}(:,1);MFstate{4}(:,1)=tmp;elseif manu=='L'MFstate{5}=fliplr(MFstate{5}).';tmp=MFstate{1}(:,1);MFstate{1}(:,1)=MFstate{4}(:,1);MFstate{4}(:,1)=MFstate{2}(:,1);MFstate{2}(:,1)=MFstate{6}(:,1);MFstate{6}(:,1)=tmp;elseif manu=='u'MFstate{6}=fliplr(MFstate{6}.');tmp=MFstate{1}(1,:);MFstate{1}(1,:)=MFstate{3}(1,:);MFstate{3}(1,:)=fliplr(MFstate{2}(3,:));MFstate{2}(3,:)=fliplr(MFstate{5}(1,:));MFstate{5}(1,:)=tmp;elseif manu=='U'MFstate{6}=fliplr(MFstate{6}).';tmp=MFstate{1}(1,:);MFstate{1}(1,:)=MFstate{5}(1,:);MFstate{5}(1,:)=fliplr(MFstate{2}(3,:));MFstate{2}(3,:)=fliplr(MFstate{3}(1,:));MFstate{3}(1,:)=tmp;elseif manu=='d'MFstate{4}=fliplr(MFstate{4}.');tmp=MFstate{1}(3,:);MFstate{1}(3,:)=MFstate{5}(3,:);MFstate{5}(3,:)=fliplr(MFstate{2}(1,:));MFstate{2}(1,:)=fliplr(MFstate{3}(3,:));MFstate{3}(3,:)=tmp;elseif manu=='D'MFstate{4}=fliplr(MFstate{4}).';tmp=MFstate{1}(3,:);MFstate{1}(3,:)=MFstate{3}(3,:);MFstate{3}(3,:)=fliplr(MFstate{2}(1,:));MFstate{2}(1,:)=fliplr(MFstate{5}(3,:));MFstate{5}(3,:)=tmp;elseif manu=='f'MFstate{1}=fliplr(MFstate{1}.');tmp=MFstate{6}(3,:);MFstate{6}(3,:)=fliplr(MFstate{5}(:,3).');MFstate{5}(:,3)=MFstate{4}(1,:).';MFstate{4}(1,:)=fliplr(MFstate{3}(:,1).');MFstate{3}(:,1)=tmp.';elseif manu=='F'MFstate{1}=fliplr(MFstate{1}).';tmp=MFstate{6}(3,:);MFstate{6}(3,:)=MFstate{3}(:,1).';MFstate{3}(:,1)=fliplr(MFstate{4}(1,:)).';MFstate{4}(1,:)=MFstate{5}(:,3).';MFstate{5}(:,3)=fliplr(tmp).';elseif manu=='b'MFstate{2}=fliplr(MFstate{2}.');tmp=MFstate{6}(1,:);MFstate{6}(1,:)=MFstate{3}(:,3).';MFstate{3}(:,3)=fliplr(MFstate{4}(3,:)).';MFstate{4}(3,:)=MFstate{5}(:,1).';MFstate{5}(:,1)=fliplr(tmp).';elseif manu=='B'MFstate{2}=fliplr(MFstate{2}).';tmp=MFstate{6}(1,:);MFstate{6}(1,:)=fliplr(MFstate{5}(:,1).');MFstate{5}(:,1)=MFstate{4}(3,:).';MFstate{4}(3,:)=fliplr(MFstate{3}(:,3).');MFstate{3}(:,3)=tmp.';else return;end
end% ---作魔方正方体图形
function hds=pltMoFang(MFstate)for n=1:6h=pltMoFangface(MFstate{n},n);hds{n}=h;end
endfunction hds=pltMoFangface(A,Fnum)if Fnum==1x=repmat(0:1:3,4,1);y=zeros(4);z=repmat(0:1:3,4,1).';elseif Fnum==2x=repmat(0:1:3,4,1);y=3*ones(4);z=repmat(3:-1:0,4,1).';elseif Fnum==3x=3*ones(4);y=repmat(0:1:3,4,1);z=repmat(0:1:3,4,1).';elseif Fnum==4  x=repmat(0:1:3,4,1);y=repmat(0:1:3,4,1).';z=3*ones(4);elseif Fnum==5x=zeros(4);y=repmat(3:-1:0,4,1);z=repmat(0:1:3,4,1).';elseif Fnum==6x=repmat(0:1:3,4,1);y=repmat(3:-1:0,4,1).';z=zeros(4);endfor n=1:3for nn=1:3X=-[x(n,nn),x(n+1,nn),x(n+1,nn+1),x(n,nn+1)];Y=-[y(n,nn),y(n+1,nn),y(n+1,nn+1),y(n,nn+1)];Z=-[z(n,nn),z(n+1,nn),z(n+1,nn+1),z(n,nn+1)];if A(n,nn)==1C=[1,0,0];elseif A(n,nn)==2C=[1,0,1];elseif A(n,nn)==3C=[1,1,0];elseif A(n,nn)==4C=[0,1,0];elseif A(n,nn)==5C=[1,1,1];elseif A(n,nn)==6C=[0,0,1];endhds{n,nn}=fill3(X,Y,Z,C);hold on;endend
end%% 随机打乱魔方的函数
function [MFstate,TurnManu]=disorganize(MFstate,TurnNum)
% % r,l,u,d 共4种行为--->更名a,A,d,D
% MFstate=faceTurn(MFstate,'N');
% % rR,lL,uU,dD,fF,bB共12种行为
% MFstate=sideTurn(MFstate,'N');
if ischar(TurnNum)==1TurnManu=TurnNum;TurnNum=length(TurnManu);if size(TurnManu,2)>1TurnManu=TurnManu.';endif contains(TurnManu.','2')==1TurnManu=DispTurnManu(TurnManu);end
elseTurnManu=char(TurnNum,1);flagStr=['a','A','c','C','r','R','l','L','u','U','d','D','f','F','b','B'];   for n=1:TurnNumnum=randperm(16,1);TurnManu(n)=flagStr(num);end
endfor n=1:TurnNumflag=TurnManu(n);switch flagcase 'a'MFstate=faceTurn(MFstate,'r');case 'A'MFstate=faceTurn(MFstate,'l');case 'c'MFstate=faceTurn(MFstate,'u');case 'C'MFstate=faceTurn(MFstate,'d');case 'r'MFstate=sideTurn(MFstate,'r');case 'R'MFstate=sideTurn(MFstate,'R');case 'l'MFstate=sideTurn(MFstate,'l');case 'L'MFstate=sideTurn(MFstate,'L');case 'u'MFstate=sideTurn(MFstate,'u');case 'U'MFstate=sideTurn(MFstate,'U');case 'd'MFstate=sideTurn(MFstate,'d');case 'D'MFstate=sideTurn(MFstate,'D');case 'f'MFstate=sideTurn(MFstate,'f');case 'F'MFstate=sideTurn(MFstate,'F');case 'b'MFstate=sideTurn(MFstate,'b');case 'B'MFstate=sideTurn(MFstate,'B');endend
end%% 逆序恢复魔方
function [MFstate,TurnManu]=InvRecover(MFstate,TurnManu)
% % r,l,u,d 共4种行为--->更名a,A,c,C
% MFstate=faceTurn(MFstate,'N');
% %  rR,lL,uU,dD,fF,bB共12种行为
% MFstate=sideTurn(MFstate,'N');
TurnManu=flipud(TurnManu);for n=1:length(TurnManu)flag=TurnManu(n);switch flagcase 'a'MFstate=faceTurn(MFstate,'l');TurnManu(n)='A';case 'A'MFstate=faceTurn(MFstate,'r');TurnManu(n)='a';case 'c'MFstate=faceTurn(MFstate,'d');TurnManu(n)='C';case 'C'MFstate=faceTurn(MFstate,'u');TurnManu(n)='c';case 'r'MFstate=sideTurn(MFstate,'R');TurnManu(n)='R';case 'R'MFstate=sideTurn(MFstate,'r');TurnManu(n)='r';case 'l'MFstate=sideTurn(MFstate,'L');TurnManu(n)='L';case 'L'MFstate=sideTurn(MFstate,'l');TurnManu(n)='l';case 'u'MFstate=sideTurn(MFstate,'U');TurnManu(n)='U';case 'U'MFstate=sideTurn(MFstate,'u');TurnManu(n)='u';case 'd'MFstate=sideTurn(MFstate,'D');TurnManu(n)='D';case 'D'MFstate=sideTurn(MFstate,'d');TurnManu(n)='d';case 'f'MFstate=sideTurn(MFstate,'F');TurnManu(n)='F';case 'F'MFstate=sideTurn(MFstate,'f');TurnManu(n)='f';case 'b'MFstate=sideTurn(MFstate,'B');TurnManu(n)='B';case 'B'MFstate=sideTurn(MFstate,'b');TurnManu(n)='b';endend
end% %% 简化旋转魔方操作,只取有效操作
% function TurnManu=simplifyTurnManu(TurnManu)
% N0=length(TurnManu);
%
% % ---消除正反操作
% N=length(TurnManu);
% n=N;
% while(n>1)
%     if (TurnManu(n)=='a' && TurnManu(n-1)=='A' ) || (TurnManu(n)=='A' && TurnManu(n-1)=='a' ) || ...
%        (TurnManu(n)=='c' && TurnManu(n-1)=='C' ) || (TurnManu(n)=='C' && TurnManu(n-1)=='c' ) || ...
%        (TurnManu(n)=='r' && TurnManu(n-1)=='R' ) || (TurnManu(n)=='R' && TurnManu(n-1)=='r' )  ||...
%        (TurnManu(n)=='l' && TurnManu(n-1)=='L' )  || (TurnManu(n)=='L' && TurnManu(n-1)=='l' )   ||...
%        (TurnManu(n)=='u' && TurnManu(n-1)=='U' ) || (TurnManu(n)=='U' && TurnManu(n-1)=='u' ) ||...
%        (TurnManu(n)=='d' && TurnManu(n-1)=='D' ) || (TurnManu(n)=='D' && TurnManu(n-1)=='d' ) ||...
%        (TurnManu(n)=='f' && TurnManu(n-1)=='F' )  || (TurnManu(n)=='F' && TurnManu(n-1)=='f' )   ||...
%        (TurnManu(n)=='b' && TurnManu(n-1)=='B' ) || (TurnManu(n)=='B' && TurnManu(n-1)=='b' )
%
%         TurnManu(n-1:n)=[];
%         n=n-1;
%     end
%     n=n-1;
% end
%
%
% % ---消除4次相同操作
% N=length(TurnManu);
% n=N;
% while(n>3)
%     if (TurnManu(n)==TurnManu(n-1)) &&...
%         (TurnManu(n-1)==TurnManu(n-2)) &&...
%         (TurnManu(n-2)==TurnManu(n-3))
%
%             TurnManu(n-3:n)=[];
%             n=n-3;
%     end
%     n=n-1;
% end
%
% % ---3次相同操作替换为一次反向操作
% N=length(TurnManu);
% n=N;
% while(n>2)
%     if (TurnManu(n)==TurnManu(n-1)) &&...
%         (TurnManu(n-1)==TurnManu(n-2))
%
%         if TurnManu(n-2)>90
%                 TurnManu(n-2)=TurnManu(n-2)-32;
%         else
%                 TurnManu(n-2)=TurnManu(n-2)+32;
%         end
%
%         TurnManu(n-1:n)=[];
%         n=n-1;
%
%     end
%     n=n-1;
% end
%
% while(length(TurnManu)<N0)
%     TurnManu=simplifyTurnManu(TurnManu);
%     N0=length(TurnManu);
% end
%
% end%% 简化显示旋转魔方操作,将重复2次操作显示为操作2
function TurnManu=DispTurnManu(TurnManu,dispFlag)
if nargin==1dispFlag=0;
end
if size(TurnManu,2)>1TurnManu=TurnManu.';
end
if contains(TurnManu.','2')if dispFlag==1 disp(['Before:  ',TurnManu.'])endN=length(TurnManu);n=N;while(n>1)if TurnManu(n)=='2'TurnManu(n)=TurnManu(n-1);endn=n-1;endif dispFlag==1 disp(['After:  ',TurnManu.'])end
else if dispFlag==1 disp(['Before:  ',TurnManu.'])endN=length(TurnManu);n=N;while(n>1)if TurnManu(n)==TurnManu(n-1)num=2;while n>2 && TurnManu(n)==TurnManu(n-2)num=num+1;TurnManu(n)=[];n=n-1;endTurnManu(n)=num2str(num);endn=n-1;endif dispFlag==1 disp(['After:  ',TurnManu.'])end
end
end%% 将顶层4个角恢复
function [MFstate,TurnManu,num]=recoverF4(MFstate,num)TurnManu=[];%---第一层恢复%记录面的位置obj1=MFstate{1}(2,2);obj2=MFstate{2}(2,2);obj3=MFstate{3}(2,2);obj4=MFstate{4}(2,2);obj5=MFstate{5}(2,2);obj6=MFstate{6}(2,2);if  MFstate{6}(1,1)==obj6 && MFstate{2}(3,1)==obj2 && MFstate{5}(1,1)==obj5num(1)=1;  endif  MFstate{6}(1,3)==obj6 && MFstate{2}(3,3)==obj2 && MFstate{3}(1,3)==obj3num(2)=1;  endif  MFstate{6}(3,3)==obj6 && MFstate{1}(1,3)==obj1 && MFstate{3}(1,1)==obj3 num(3)=1;  endif  MFstate{6}(3,1)==obj6 && MFstate{1}(1,1)==obj1 && MFstate{5}(1,3)==obj5num(4)=1;  end%---4角拼完if sum(num)==4; return;endif num(1)==0if  MFstate{2}(1,1)==obj2 && MFstate{5}(3,1)==obj6 && MFstate{4}(3,1)==obj5[MFstate,TnMn]=disorganize(MFstate,'BlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(1,1)==obj6 && MFstate{5}(3,1)==obj5 && MFstate{4}(3,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'lBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(1,1)==obj5 && MFstate{5}(3,1)==obj2 && MFstate{4}(3,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'Ld2ldBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(3,3)==obj2 && MFstate{2}(1,3)==obj6 && MFstate{4}(3,3)==obj5[MFstate,TnMn]=disorganize(MFstate,'dBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(3,3)==obj6 && MFstate{2}(1,3)==obj5 && MFstate{4}(3,3)==obj2[MFstate,TnMn]=disorganize(MFstate,'dlBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(3,3)==obj5 && MFstate{2}(1,3)==obj2 && MFstate{4}(3,3)==obj6[MFstate,TnMn]=disorganize(MFstate,'dLd2ldBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(3,3)==obj2 && MFstate{1}(3,1)==obj6 && MFstate{4}(1,1)==obj5[MFstate,TnMn]=disorganize(MFstate,'DBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(3,3)==obj6 && MFstate{1}(3,1)==obj5 && MFstate{4}(1,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'DlBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(3,3)==obj5 && MFstate{1}(3,1)==obj2 && MFstate{4}(1,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'DLd2ldBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(3,3)==obj2 && MFstate{3}(3,1)==obj6 && MFstate{4}(1,3)==obj5[MFstate,TnMn]=disorganize(MFstate,'D2BlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(3,3)==obj6 && MFstate{3}(3,1)==obj5 && MFstate{4}(1,3)==obj2[MFstate,TnMn]=disorganize(MFstate,'D2lBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(3,3)==obj5 && MFstate{3}(3,1)==obj2 && MFstate{4}(1,3)==obj6[MFstate,TnMn]=disorganize(MFstate,'D2Ld2ldBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,1)==obj2 && MFstate{2}(3,1)==obj6 && MFstate{6}(1,1)==obj5[MFstate,TnMn]=disorganize(MFstate,'Ldl2BLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,1)==obj6 && MFstate{2}(3,1)==obj5 && MFstate{6}(1,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'bDB2lbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(1,3)==obj2 && MFstate{6}(1,3)==obj6 && MFstate{2}(3,3)==obj5[MFstate,TnMn]=disorganize(MFstate,'rdRBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(1,3)==obj6 && MFstate{6}(1,3)==obj5 && MFstate{2}(3,3)==obj2[MFstate,TnMn]=disorganize(MFstate,'rdRlBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(1,3)==obj5 && MFstate{6}(1,3)==obj2 && MFstate{2}(3,3)==obj6[MFstate,TnMn]=disorganize(MFstate,'rDRdBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,3)==obj2 && MFstate{6}(3,1)==obj6 && MFstate{1}(1,1)==obj5[MFstate,TnMn]=disorganize(MFstate,'lDLDlBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,3)==obj6 && MFstate{6}(3,1)==obj5 && MFstate{1}(1,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'lD2LdlBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,3)==obj5 && MFstate{6}(3,1)==obj2 && MFstate{1}(1,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'lDLDBlbL');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(1,3)==obj2 && MFstate{6}(3,3)==obj6 && MFstate{3}(1,1)==obj5[MFstate,TnMn]=disorganize(MFstate,'RD2rlBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(1,3)==obj6 && MFstate{6}(3,3)==obj5 && MFstate{3}(1,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'RdrD2lBLb');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(1,3)==obj5 && MFstate{6}(3,3)==obj2 && MFstate{3}(1,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'RD2rBlbL');TurnManu=[TurnManu;TnMn];end% 恢复完成num(1)=1;end
end%% 公式恢复第一层的十字
function [MFstate,TurnManu,num]=recoverF10(MFstate,num)TurnManu=[];%---第一层恢复%记录面的位置obj1=MFstate{1}(2,2);obj2=MFstate{2}(2,2);obj3=MFstate{3}(2,2);obj4=MFstate{4}(2,2);obj5=MFstate{5}(2,2);obj6=MFstate{6}(2,2);
if sum(num)==0%将顶层拼十字%---case1:顶层有同色块if  MFstate{6}(1,2)==obj6 && MFstate{2}(3,2)==obj2elseif  MFstate{6}(1,2)==obj6 && MFstate{2}(3,2)==obj3[MFstate,TnMn]=disorganize(MFstate,'u');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(1,2)==obj6 && MFstate{2}(3,2)==obj1[MFstate,TnMn]=disorganize(MFstate,'u2');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(1,2)==obj6 && MFstate{2}(3,2)==obj5[MFstate,TnMn]=disorganize(MFstate,'U');TurnManu=[TurnManu;TnMn];elseif  MFstate{6}(2,3)==obj6 && MFstate{3}(1,2)==obj3elseif MFstate{6}(2,3)==obj6  && MFstate{3}(1,2)==obj1[MFstate,TnMn]=disorganize(MFstate,'u');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(2,3)==obj6 && MFstate{3}(1,2)==obj5[MFstate,TnMn]=disorganize(MFstate,'u2');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(2,3)==obj6 && MFstate{3}(1,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'U');TurnManu=[TurnManu;TnMn];elseif  MFstate{6}(3,2)==obj6 && MFstate{1}(1,2)==obj1elseif MFstate{6}(3,2)==obj6 && MFstate{1}(1,2)==obj5[MFstate,TnMn]=disorganize(MFstate,'u');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(3,2)==obj6 && MFstate{1}(1,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'u2');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(3,2)==obj6 && MFstate{1}(1,2)==obj3[MFstate,TnMn]=disorganize(MFstate,'U');TurnManu=[TurnManu;TnMn];elseif  MFstate{6}(2,1)==obj6 && MFstate{5}(1,2)==obj5elseif MFstate{6}(2,1)==obj6 && MFstate{5}(1,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'u');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(2,1)==obj6 && MFstate{5}(1,2)==obj3[MFstate,TnMn]=disorganize(MFstate,'u2');TurnManu=[TurnManu;TnMn];elseif MFstate{6}(2,1)==obj6 && MFstate{5}(1,2)==obj1[MFstate,TnMn]=disorganize(MFstate,'U');TurnManu=[TurnManu;TnMn];end
end        if  MFstate{6}(1,2)==obj6 && MFstate{2}(3,2)==obj2num(1)=1;  endif  MFstate{6}(2,3)==obj6 && MFstate{3}(1,2)==obj3num(2)=1;  endif  MFstate{6}(3,2)==obj6 && MFstate{1}(1,2)==obj1num(3)=1;  endif  MFstate{6}(2,1)==obj6 && MFstate{5}(1,2)==obj5num(4)=1;  end%---十字拼完if sum(num)==4; return;endif num(1)==0if  MFstate{2}(1,2)==obj6 && MFstate{4}(3,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'dlBL');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(1,2)==obj2 && MFstate{4}(3,2)==obj6[MFstate,TnMn]=disorganize(MFstate,'b2');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(2,3)==obj6 && MFstate{3}(2,3)==obj2[MFstate,TnMn]=disorganize(MFstate,'rdRb2');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(2,3)==obj2 && MFstate{3}(2,3)==obj6[MFstate,TnMn]=disorganize(MFstate,'b');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(2,1)==obj6 && MFstate{5}(2,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'LDlb2');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(2,1)==obj2 && MFstate{5}(2,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'B');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(3,2)==obj6 && MFstate{6}(1,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'bLDlb2');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(1,2)==obj6 && MFstate{6}(2,3)==obj2[MFstate,TnMn]=disorganize(MFstate,'rb');TurnManu=[TurnManu;TnMn];     elseif  MFstate{3}(1,2)==obj2 && MFstate{6}(2,3)==obj6[MFstate,TnMn]=disorganize(MFstate,'r2db2Dr2');TurnManu=[TurnManu;TnMn]; elseif  MFstate{1}(1,2)==obj6 && MFstate{6}(3,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'f2dRbr');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(1,2)==obj2 && MFstate{6}(3,2)==obj6[MFstate,TnMn]=disorganize(MFstate,'f2d2b2');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,2)==obj6 && MFstate{6}(2,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'LB');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(1,2)==obj2 && MFstate{6}(2,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'L2Db2');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(3,2)==obj2 && MFstate{4}(2,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'Db2');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(3,2)==obj6 && MFstate{4}(2,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'lBL');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(2,3)==obj6 && MFstate{1}(2,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'l2BL2');TurnManu=[TurnManu;TnMn];elseif  MFstate{5}(2,3)==obj2 && MFstate{1}(2,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'lDLB2');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(3,2)==obj2 && MFstate{4}(1,2)==obj6[MFstate,TnMn]=disorganize(MFstate,'D2B2');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(3,2)==obj6 && MFstate{4}(1,2)==obj2[MFstate,TnMn]=disorganize(MFstate,'dRbr');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(2,3)==obj6 && MFstate{3}(2,1)==obj2[MFstate,TnMn]=disorganize(MFstate,'RdrB2');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(2,3)==obj2 && MFstate{3}(2,1)==obj6[MFstate,TnMn]=disorganize(MFstate,'fd2FB2');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(3,2)==obj2 && MFstate{4}(2,3)==obj6[MFstate,TnMn]=disorganize(MFstate,'dB2');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(3,2)==obj6 && MFstate{4}(2,3)==obj2[MFstate,TnMn]=disorganize(MFstate,'Rbr');TurnManu=[TurnManu;TnMn];end% 恢复完成num(1)=1;end
end%% 将第二层4个角恢复
function [MFstate,TurnManu,num]=recover2F4(MFstate,num)TurnManu=[];%---第一层恢复%记录面的位置obj1=MFstate{1}(2,2);obj2=MFstate{2}(2,2);obj3=MFstate{3}(2,2);obj4=MFstate{4}(2,2);obj5=MFstate{5}(2,2);obj6=MFstate{6}(2,2);      if  MFstate{1}(2,3)==obj1 && MFstate{3}(2,1)==obj3num(1)=1;  endif  MFstate{3}(2,3)==obj3 && MFstate{2}(2,3)==obj2num(2)=1;  endif  MFstate{2}(2,1)==obj2 && MFstate{5}(2,1)==obj5num(3)=1;  endif  MFstate{1}(2,1)==obj1 && MFstate{5}(2,3)==obj5num(4)=1;  end%---第二层拼完if sum(num)==4; return;endif num(1)==0if  MFstate{1}(2,3)==obj3 && MFstate{3}(2,1)==obj1[MFstate,TnMn]=disorganize(MFstate,'rURUFufUrURUFuf');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(2,3)==obj3 && MFstate{2}(2,3)==obj1[MFstate,TnMn]=disorganize(MFstate,'ArURUFufarURUFuf');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(2,3)==obj1 && MFstate{2}(2,3)==obj3[MFstate,TnMn]=disorganize(MFstate,'ArURUFufauFufurUR');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(2,1)==obj3 && MFstate{5}(2,1)==obj1[MFstate,TnMn]=disorganize(MFstate,'a2rURUFufA2urURUFuf');TurnManu=[TurnManu;TnMn];elseif  MFstate{2}(2,1)==obj1 && MFstate{5}(2,1)==obj3[MFstate,TnMn]=disorganize(MFstate,'a2rURUFufA2U2FufurUR');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(2,1)==obj1 && MFstate{5}(2,3)==obj3[MFstate,TnMn]=disorganize(MFstate,'arURUFufAu2rURUFuf');TurnManu=[TurnManu;TnMn];elseif  MFstate{1}(2,1)==obj3 && MFstate{5}(2,3)==obj1[MFstate,TnMn]=disorganize(MFstate,'arURUFufAUFufurUR');TurnManu=[TurnManu;TnMn];elseif  MFstate{3}(1,2)==obj3 && MFstate{6}(2,3)==obj1[MFstate,TnMn]=disorganize(MFstate,'UFufurUR');TurnManu=[TurnManu;TnMn];   elseif  MFstate{2}(3,2)==obj3 && MFstate{6}(1,2)==obj1[MFstate,TnMn]=disorganize(MFstate,'FufurUR');TurnManu=[TurnManu;TnMn];    elseif  MFstate{5}(1,2)==obj3 && MFstate{6}(2,1)==obj1[MFstate,TnMn]=disorganize(MFstate,'uFufurUR');TurnManu=[TurnManu;TnMn];     elseif  MFstate{1}(1,2)==obj3 && MFstate{6}(3,2)==obj1[MFstate,TnMn]=disorganize(MFstate,'u2FufurUR');TurnManu=[TurnManu;TnMn];    elseif  MFstate{3}(1,2)==obj1 && MFstate{6}(2,3)==obj3[MFstate,TnMn]=disorganize(MFstate,'u2rURUFuf');TurnManu=[TurnManu;TnMn];     elseif  MFstate{2}(3,2)==obj1 && MFstate{6}(1,2)==obj3[MFstate,TnMn]=disorganize(MFstate,'UrURUFuf');TurnManu=[TurnManu;TnMn];  elseif  MFstate{5}(1,2)==obj1 && MFstate{6}(2,1)==obj3[MFstate,TnMn]=disorganize(MFstate,'rURUFuf');TurnManu=[TurnManu;TnMn];     elseif  MFstate{1}(1,2)==obj1 && MFstate{6}(3,2)==obj3[MFstate,TnMn]=disorganize(MFstate,'urURUFuf');TurnManu=[TurnManu;TnMn];                   end% 恢复完成num(1)=1;end
end
%% 公式恢复第三层的十字
function [MFstate,TurnManu]=recover3F10(MFstate)
TurnManu=[];
flg=0;while flg~=1flg=is10ok(MFstate);if flg==1break;elseif flg==2[MFstate,TnMu]=disorganize(MFstate,'u');TurnManu=[TurnManu;TnMu];elseif flg==3[MFstate,TnMu]=disorganize(MFstate,'U');TurnManu=[TurnManu;TnMu];elseif flg==4[MFstate,TnMu]=disorganize(MFstate,'U2');TurnManu=[TurnManu;TnMu];elseif flg==5[MFstate,TnMu]=disorganize(MFstate,'u');TurnManu=[TurnManu;TnMu];end[MFstate,TnMu]=disorganize(MFstate,'RUFufr');TurnManu=[TurnManu;TnMu];end
endfunction flg=is10ok(MFstate)
flg=0;if MFstate{6}(2) == MFstate{6}(5) &&...MFstate{6}(4) == MFstate{6}(5) &&...     MFstate{6}(6) == MFstate{6}(5) &&...MFstate{6}(8) == MFstate{6}(5) flg=1;elseif MFstate{6}(4)==MFstate{6}(5) && MFstate{6}(6)==MFstate{6}(5)flg=2;  elseif MFstate{6}(4)==MFstate{6}(5) && MFstate{6}(8)==MFstate{6}(5)flg=3; elseif MFstate{6}(6)==MFstate{6}(5) && MFstate{6}(8)==MFstate{6}(5)flg=4;elseif MFstate{6}(2)==MFstate{6}(5) && MFstate{6}(6)==MFstate{6}(5)flg=5;end
end%% 将第三层4个角位置对应上
function [MFstate,TurnManu]=recover3F4(MFstate)
TurnManu=[];
flg=0;while flg~=1[flg,num]=is4ok(MFstate);while sum(num)<2 [MFstate,TnMu]=disorganize(MFstate,'U');TurnManu=[TurnManu;TnMu];[flg,num]=is4ok(MFstate);endif flg==1break;elseif flg==2if num(4)==1[MFstate,TnMu]=disorganize(MFstate,'a');TurnManu=[TurnManu;TnMu];endelseif flg==3[MFstate,TnMu]=disorganize(MFstate,'A');TurnManu=[TurnManu;TnMu];elseif flg==4[MFstate,TnMu]=disorganize(MFstate,'A2');TurnManu=[TurnManu;TnMu];elseif flg==5[MFstate,TnMu]=disorganize(MFstate,'a');TurnManu=[TurnManu;TnMu];end[MFstate,TnMu]=disorganize(MFstate,'rULuRUlU2');TurnManu=[TurnManu;TnMu];end
endfunction [flg,num]=is4ok(MFstate)
num=zeros(1,4);%记录面的位置o1=MFstate{1}(2,2);o2=MFstate{2}(2,2);o3=MFstate{3}(2,2);o4=MFstate{4}(2,2);o5=MFstate{5}(2,2);o6=MFstate{6}(2,2);A=[o1,o3,o6;o3,o2,o6;o2,o5,o6;o1,o5,o6];B=[MFstate{1}(1,3),MFstate{3}(1,1),MFstate{6}(3,3);...MFstate{3}(1,3),MFstate{2}(3,3),MFstate{6}(1,3);...MFstate{2}(3,1),MFstate{5}(1,1),MFstate{6}(1,1);...MFstate{5}(1,3),MFstate{1}(1,1),MFstate{6}(3,1);...];flg=0;for n=1:4num(n) = isfit(A(n,:),B(n,:));endif sum(num)==4flg=1;elseif num(1)==1flg=2;elseif num(2)==1flg=3;elseif num(3)==1flg=4;elseif num(4)==1flg=5;end
endfunction flg=isfit(a,b)
flg=0;
if (a(1)==b(1) && a(2)==b(2) && a(3)==b(3)) ||... (a(1)==b(2) && a(2)==b(3) && a(3)==b(1)) ||...(a(1)==b(3) && a(2)==b(1) && a(3)==b(2)) ||...(a(1)==b(1) && a(2)==b(3) && a(3)==b(2)) ||...(a(1)==b(2) && a(2)==b(1) && a(3)==b(3)) ||...(a(1)==b(3) && a(2)==b(2) && a(3)==b(1)) flg=1;
endend
%% 顶面恢复
function [MFstate,TurnManu]=recover3Face(MFstate)
TurnManu=[];
num=0;
for n=1:3for nn=1:3if MFstate{6}(n,nn)==MFstate{6}(2,2)num=num+1;endend
endif num==9return;%顶面恢复完成
elseif num==5while (MFstate{2}(3,1)==MFstate{6}(2,2) || MFstate{2}(3,3)==MFstate{6}(2,2)) [MFstate,TnMu]=disorganize(MFstate,'a');TurnManu=[TurnManu;TnMu];end[MFstate,TnMu]=disorganize(MFstate,'RUrURU2rU2');TurnManu=[TurnManu;TnMu];
elseif num==6while (MFstate{6}(1,1)~=MFstate{6}(2,2) ) [MFstate,TnMu]=disorganize(MFstate,'a');TurnManu=[TurnManu;TnMu];end[MFstate,TnMu]=disorganize(MFstate,'RUrURU2rU2');TurnManu=[TurnManu;TnMu];
elseif num==7Tn=0;while Tn<5 && ((MFstate{6}(1,3)~=MFstate{6}(2,2) || ...MFstate{6}(2,3)~=MFstate{6}(2,2) || ...MFstate{6}(3,3)~=MFstate{6}(2,2))) [MFstate,TnMu]=disorganize(MFstate,'a');TurnManu=[TurnManu;TnMu];Tn=Tn+1;end[MFstate,TnMu]=disorganize(MFstate,'RUrURU2rU2');TurnManu=[TurnManu;TnMu];
endend%% 顶棱中恢复
function [MFstate,TurnManu]=recover3FArris(MFstate)TurnManu=[];if MFstate{1}(1,2)==MFstate{1}(2,2) && MFstate{3}(1,2)==MFstate{3}(2,2) return;elseif MFstate{1}(1,2)==MFstate{1}(2,2)[MFstate,TnMu]=disorganize(MFstate,'a2');TurnManu=[TurnManu;TnMu];elseif MFstate{3}(1,2)==MFstate{3}(2,2) [MFstate,TnMu]=disorganize(MFstate,'a');TurnManu=[TurnManu;TnMu];elseif MFstate{5}(1,2)==MFstate{5}(2,2) [MFstate,TnMu]=disorganize(MFstate,'A');TurnManu=[TurnManu;TnMu];endif MFstate{1}(1,2)==MFstate{3}(2,2) [MFstate,TnMu]=disorganize(MFstate,'F2URlF2rLUF2');TurnManu=[TurnManu;TnMu];else[MFstate,TnMu]=disorganize(MFstate,'F2uRlF2rLuF2');TurnManu=[TurnManu;TnMu];end
end

三阶魔方自动求解及动态可视化matlab代码相关推荐

  1. 三阶魔方自动还原 vc实现

    魔方自动求解程序一般有两种方法,一种是按照人还原魔方的步骤,一步步来,另外一种是使用数学方法,魔方自有一套复杂的数学理论,其中较著名的是两阶段算法(压缩文件中的cube430.exe使用的就是数学方法 ...

  2. 货物配送问题的matlab,免疫算法求解配送中心选址问题matlab代码

    免疫算法求解配送中心选址问题matlab代码 所属分类:matlab例程 开发工具:matlab 文件大小:31KB 下载次数:3 上传日期:2020-12-01 16:11:00 上 传 者:代码大 ...

  3. 【优化调度】基于粒子群算法求解梯级水电站调度问题matlab代码

    1 简介 粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究.设想这样一个场 ...

  4. matlab 读取图片后分区域编号_你的第一个有限元求解器——仅十行MATLAB代码

    有限元分析话题中有不少讨论有限元求解器的问题,但大都停留在概念层面,未见实际代码.望本文能略起抛砖引玉之作用. 以下代码是基于MATLAB编写. 问题描述 考虑一平面有界区域 ,设其边界为 .我们求解 ...

  5. 【路径优化】基于帝企鹅算法求解TSP问题(Matlab代码实现)

    目录 1 帝企鹅算法 2 旅行商问题(TSP) 3 运行结果 4 参考文献 5 Matlab代码实现 1 帝企鹅算法 帝企鹅优化算法(emperor penguin optimizer,EPO)是Ga ...

  6. 【优化求解】基于灰狼算法GWO求解最优目标matlab代码

    1 简介 Mirjalili 等人提出了一种新的群体智能算法---灰狼优化算法(GWO),并通过多个基准测试函数进行测试,从结果上验证了该算法的可行性,通过对比,GWO 算法已被证明在算法对函数求解精 ...

  7. 【图像检测】基于计算机视觉实现地质断层结构的自动增强和识别附matlab代码

    1 内容介绍 在本文中,我们提出了一个用于自动增强和识别活动海断层的框架,通常使用测深图像与地震活动相关联. 据我们所知,基于图像分析方法的海断层自动识别问题尚属首次. 首先,我们计算 Slope 和 ...

  8. 【通信】基于OFDMA系统的多用户资源分配求解论附文和MATLAB代码

    1 简介 随着生活质量的不断提高,人们对通信业务的要求日益增长,现有的通信系统已经无法满足人们的多样化需求.因此,研究人员正在致力于新型通信技术的研究.协作中继通信技术充分利用了无线媒介的广播特性,在 ...

  9. 基于改进禁忌搜索算法求解TSP问题(Matlab代码实现)

    目录 1 概述 2 改进禁忌搜索算法 3 运行结果 4 参考文献 5 Matlab代码实现 1 概述 当城市数量较少时,理论上可以通过穷举法来列举出最优方案,然而当城市数量较多时,所有路线之和将呈指数 ...

最新文章

  1. ModuleNotFoundError: No module named ‘mmcv._ext‘
  2. axios请求五种方法
  3. python将列表横着输出来
  4. Hyperopt中文文档:FMin
  5. 10个对Web开发者最有用的Python包
  6. linux中pri=100,浅析Linux中PRI和NI的关系
  7. centos-stream-9安装chrome谷歌浏览器
  8. Oracle11g新特性:在线操作功能增强-可等待DDL操作
  9. java异常处理代码详解_Java异常处理机制总结
  10. uniapp动态显示数组_【报Bug】uniapp 在小程序中 动态修改添加 数组 数据 ,点击获取的索引值错误...
  11. 196.删除重复的电子邮箱
  12. [转]FTP搜索引擎的设计与实现(优化版)
  13. SpreadJS使用小结
  14. 服务器装usb无线网卡,小巧便携的USB无线网卡,让台式电脑实现wifi自由
  15. Jupyter Notebook 工作环境配置
  16. 【Visual C 】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲
  17. EditText更改光标的大小和颜色
  18. [实验吧刷题]密码学部分
  19. 解决:-bash redis-server 未找到命令
  20. java 月份缩写_关于java:如何将日期字符串解析为Date?

热门文章

  1. 说说 Wine + QQ 轻聊版 7.7 的安装步骤
  2. mysql学生选课系统的关系模型_数据库系统原理ER模型与关系模型
  3. LS-DYNA钢筋拉伸试验仿真
  4. Mybatis实现insert获取自增id
  5. linux获取路由器wan口的ip地址,如何查看wan口ip地址_wan口ip地址怎么查?-192路由网...
  6. [翻译]Kean' Blog 在一个.NET应用程序中调用AutoCAD
  7. 使用预训练语言模型预测阶段:GPU、CPU性能差别【Pegasus】
  8. iOS UITableView下拉刷新上拉加载更多EGOTableViewPullRefresh类库使用初级剑侠篇(欢迎提建议和分享遇到的问题)
  9. Learning without Forgetting 翻译
  10. Windows Azure Cloud Service (1) 用户手册