三阶魔方自动求解及动态可视化matlab代码
- 思路与步骤
- 总结
- 思考
- 参考链接
-
- 源代码
第一次写博客,想总结分享下以前做过的一些有趣的东西,目的是为了回望过去与展望未来,同时为了提高自己的写作表达能力。 【程序人生|三阶魔方自动求解及动态可视化matlab代码】
思路与步骤
- 三阶魔方有6个面,每个面有 3 × 3 3\times3 3×3小块,用一个 6 × 3 × 3 6\times3\times3 6×3×3的矩阵来保存魔方的状态;
- 定义4+12种魔方旋转行为:整体旋转(左右上下共4种方式AaCc),侧面(6个侧面顺逆时针旋转共12种方式LlRrUuDdFfBb),旋转可视化界面方便调试(三维小面作图fill3创建 6 × 3 × 3 = 54 6\times3\times3=54 6×3×3=54个小面对象,对象成员属性包括颜色和4个三维坐标点,定义了全局函数对小面进行绕轴旋转操作,如此可以可视化调试,确保程序是按人想法运行),旋转行为改变矩阵的状态矩阵;
- 定义随机打乱和逆序恢复的函数,测试确保人为给出旋转公式,魔方能正确旋转;
- 编写按公式恢复魔方的函数,记录恢复过程的旋转过程公式(取一个魔方一边拧一边编程,考虑所有情况)
1):顶层拼十字:简化为4次恢复顶面棱中小块(不破坏已恢复的结果)
2):顶层拼四角:简化为4次恢复顶面的角小块(不破坏已恢复的结果)
第一层恢复完成,剩下可按公式恢复魔方,把第一层置底
3):二层拼棱角:简化为4次恢复二层棱角小块(不破坏已恢复的结果)
第二层恢复完成
4):按公式顶层拼十字
5):按公式顶层四角对应恢复
6):按公式顶面同色恢复
7):按公式顶面棱边恢复
第三层恢复完成 - 编写一个公式简化的函数,如消除相邻正反操作、消除4次相同操作、3次同向旋转替换为一次反向旋转操作、不相关跳跃旋转整合等,未能考虑所有可化简的情况,还未能化简为最少旋转步数公式。时间精力有限,待以后有新思路的时候再玩。
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;
end
MFstate=faceTurn(MFstate,'r');
num=circshift(num,-1);
TurnManu=[TurnManu;
'a'];
end
TurnManu=[TurnManu;
('- ').'];
%将顶层4个角恢复,完成第一层恢复
num=zeros(1,4);
for n=1:4
[MFstate,TnMn,num]=recoverF4(MFstate,num);
TurnManu=[TurnManu;
TnMn];
if sum(num)==4;
break;
end
MFstate=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;
end
MFstate=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==4
limL=-3;
limU=0;
end
if TurnManu=='a'
[az,el]=view();
azStep=linspace(0,-90,stepNum);
for n=1:stepNum
view(az+azStep(n),el);
pause(tSec);
endelseif TurnManu=='A'
[az,el]=view();
azStep=linspace(0,90,stepNum);
for n=1:stepNum
view(az+azStep(n),el);
pause(tSec);
endelseif TurnManu=='c' || TurnManu=='C'
azStep=90/(stepNum+1);
if TurnManu=='C'
azStep=-azStep;
end
direct=[1,0,0];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=1:6
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
axis([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;
end
direct=[1,0,0];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=3
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
endfor k=[1,2,4,6]
for kk=1:3
for kkk=3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
axis([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;
end
direct=[1,0,0];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=5
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
endfor k=[1,2,4,6]
for kk=1:3
for kkk=1
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
axis([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;
end
direct=[0,0,1];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=6
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
endfor k=[1,3,5]
for kk=1
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
for k=2
for kk=3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
axis([limL,limU,limL,limU,limL,limU]);
axis off;
view(160,30);
pause(tSec);
endelseif TurnManu=='d' || TurnManu=='D'
azStep=90/(stepNum+1);
if TurnManu=='D'
azStep=-azStep;
end
direct=[0,0,1];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=4
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
endfor k=[1,3,5]
for kk=3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
for k=2
for kk=1
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
axis([limL,limU,limL,limU,limL,limU]);
axis off;
view(160,30);
pause(tSec);
endelseif TurnManu=='f' || TurnManu=='F'
azStep=-90/(stepNum+1);
if TurnManu=='F'
azStep=-azStep;
end
direct=[0,1,0];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=1
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
for kk=1:3
h=hds{
3}{
kk,1};
rotate(h,direct,azStep,origin);
end
for kk=1:3
h=hds{
5}{
kk,3};
rotate(h,direct,azStep,origin);
endfor kkk=1:3
h=hds{
4}{
1,kkk};
rotate(h,direct,azStep,origin);
endfor kkk=1:3
h=hds{
6}{
3,kkk};
rotate(h,direct,azStep,origin);
end
axis([limL,limU,limL,limU,limL,limU]);
axis off;
view(160,30);
pause(tSec);
endelseif TurnManu=='b' || TurnManu=='B'
azStep=90/(stepNum+1);
if TurnManu=='B'
azStep=-azStep;
end
direct=[0,1,0];
origin=-[1.5,1.5,1.5];
for n=1:stepNum
for k=2
for kk=1:3
for kkk=1:3
h=hds{
k}{
kk,kkk};
rotate(h,direct,azStep,origin);
end
end
end
for kk=1:3
h=hds{
3}{
kk,3};
rotate(h,direct,azStep,origin);
end
for kk=1:3
h=hds{
5}{
kk,1};
rotate(h,direct,azStep,origin);
endfor kkk=1:3
h=hds{
4}{
3,kkk};
rotate(h,direct,azStep,origin);
endfor kkk=1:3
h=hds{
6}{
1,kkk};
rotate(h,direct,azStep,origin);
end
axis([limL,limU,limL,limU,limL,limU]);
axis off;
view(160,30);
pause(tSec);
endendend% ---定义魔方整体旋转行为---改变朝前面
% 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:6
h=pltMoFangface(MFstate{
n},n);
hds{
n}=h;
end
endfunction hds=pltMoFangface(A,Fnum)
if Fnum==1
x=repmat(0:1:3,4,1);
y=zeros(4);
z=repmat(0:1:3,4,1).';
elseif Fnum==2
x=repmat(0:1:3,4,1);
y=3*ones(4);
z=repmat(3:-1:0,4,1).';
elseif Fnum==3
x=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==5
x=zeros(4);
y=repmat(3:-1:0,4,1);
z=repmat(0:1:3,4,1).';
elseif Fnum==6
x=repmat(0:1:3,4,1);
y=repmat(3:-1:0,4,1).';
z=zeros(4);
endfor n=1:3
for nn=1:3
X=-[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)==1
C=[1,0,0];
elseif A(n,nn)==2
C=[1,0,1];
elseif A(n,nn)==3
C=[1,1,0];
elseif A(n,nn)==4
C=[0,1,0];
elseif A(n,nn)==5
C=[1,1,1];
elseif A(n,nn)==6
C=[0,0,1];
end
hds{
n,nn}=fill3(X,Y,Z,C);
hold on;
end
end
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)==1
TurnManu=TurnNum;
TurnNum=length(TurnManu);
if size(TurnManu,2)>1
TurnManu=TurnManu.';
end
if contains(TurnManu.','2')==1
TurnManu=DispTurnManu(TurnManu);
end
else
TurnManu=char(TurnNum,1);
flagStr=['a','A','c','C','r','R','l','L','u','U','d','D','f','F','b','B'];
for n=1:TurnNum
num=randperm(16,1);
TurnManu(n)=flagStr(num);
end
end
for n=1:TurnNum
flag=TurnManu(n);
switch flag
case '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');
end
end
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 flag
case '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';
end
end
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)1
TurnManu=TurnManu.';
end
if contains(TurnManu.','2')
if dispFlag==1
disp(['Before:',TurnManu.'])
end
N=length(TurnManu);
n=N;
while(n>1)
if TurnManu(n)=='2'
TurnManu(n)=TurnManu(n-1);
end
n=n-1;
end
if dispFlag==1
disp(['After:',TurnManu.'])
end
else
if dispFlag==1
disp(['Before:',TurnManu.'])
end
N=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;
end
TurnManu(n)=num2str(num);
end
n=n-1;
end
if 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);
ifMFstate{
6}(1,1)==obj6 && MFstate{
2}(3,1)==obj2 && MFstate{
5}(1,1)==obj5
num(1)=1;
end
ifMFstate{
6}(1,3)==obj6 && MFstate{
2}(3,3)==obj2 && MFstate{
3}(1,3)==obj3
num(2)=1;
end
ifMFstate{
6}(3,3)==obj6 && MFstate{
1}(1,3)==obj1 && MFstate{
3}(1,1)==obj3
num(3)=1;
end
ifMFstate{
6}(3,1)==obj6 && MFstate{
1}(1,1)==obj1 && MFstate{
5}(1,3)==obj5
num(4)=1;
end
%---4角拼完
if sum(num)==4;
return;
endif num(1)==0
ifMFstate{
2}(1,1)==obj2 && MFstate{
5}(3,1)==obj6 && MFstate{
4}(3,1)==obj5
[MFstate,TnMn]=disorganize(MFstate,'BlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(1,1)==obj6 && MFstate{
5}(3,1)==obj5 && MFstate{
4}(3,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'lBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(1,1)==obj5 && MFstate{
5}(3,1)==obj2 && MFstate{
4}(3,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'Ld2ldBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(3,3)==obj2 && MFstate{
2}(1,3)==obj6 && MFstate{
4}(3,3)==obj5
[MFstate,TnMn]=disorganize(MFstate,'dBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(3,3)==obj6 && MFstate{
2}(1,3)==obj5 && MFstate{
4}(3,3)==obj2
[MFstate,TnMn]=disorganize(MFstate,'dlBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(3,3)==obj5 && MFstate{
2}(1,3)==obj2 && MFstate{
4}(3,3)==obj6
[MFstate,TnMn]=disorganize(MFstate,'dLd2ldBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(3,3)==obj2 && MFstate{
1}(3,1)==obj6 && MFstate{
4}(1,1)==obj5
[MFstate,TnMn]=disorganize(MFstate,'DBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(3,3)==obj6 && MFstate{
1}(3,1)==obj5 && MFstate{
4}(1,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'DlBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(3,3)==obj5 && MFstate{
1}(3,1)==obj2 && MFstate{
4}(1,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'DLd2ldBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(3,3)==obj2 && MFstate{
3}(3,1)==obj6 && MFstate{
4}(1,3)==obj5
[MFstate,TnMn]=disorganize(MFstate,'D2BlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(3,3)==obj6 && MFstate{
3}(3,1)==obj5 && MFstate{
4}(1,3)==obj2
[MFstate,TnMn]=disorganize(MFstate,'D2lBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(3,3)==obj5 && MFstate{
3}(3,1)==obj2 && MFstate{
4}(1,3)==obj6
[MFstate,TnMn]=disorganize(MFstate,'D2Ld2ldBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,1)==obj2 && MFstate{
2}(3,1)==obj6 && MFstate{
6}(1,1)==obj5
[MFstate,TnMn]=disorganize(MFstate,'Ldl2BLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,1)==obj6 && MFstate{
2}(3,1)==obj5 && MFstate{
6}(1,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'bDB2lbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,3)==obj2 && MFstate{
6}(1,3)==obj6 && MFstate{
2}(3,3)==obj5
[MFstate,TnMn]=disorganize(MFstate,'rdRBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,3)==obj6 && MFstate{
6}(1,3)==obj5 && MFstate{
2}(3,3)==obj2
[MFstate,TnMn]=disorganize(MFstate,'rdRlBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,3)==obj5 && MFstate{
6}(1,3)==obj2 && MFstate{
2}(3,3)==obj6
[MFstate,TnMn]=disorganize(MFstate,'rDRdBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,3)==obj2 && MFstate{
6}(3,1)==obj6 && MFstate{
1}(1,1)==obj5
[MFstate,TnMn]=disorganize(MFstate,'lDLDlBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,3)==obj6 && MFstate{
6}(3,1)==obj5 && MFstate{
1}(1,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'lD2LdlBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,3)==obj5 && MFstate{
6}(3,1)==obj2 && MFstate{
1}(1,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'lDLDBlbL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(1,3)==obj2 && MFstate{
6}(3,3)==obj6 && MFstate{
3}(1,1)==obj5
[MFstate,TnMn]=disorganize(MFstate,'RD2rlBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(1,3)==obj6 && MFstate{
6}(3,3)==obj5 && MFstate{
3}(1,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'RdrD2lBLb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
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:顶层有同色块
ifMFstate{
6}(1,2)==obj6 && MFstate{
2}(3,2)==obj2
elseifMFstate{
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];
elseifMFstate{
6}(2,3)==obj6 && MFstate{
3}(1,2)==obj3
elseif 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];
elseifMFstate{
6}(3,2)==obj6 && MFstate{
1}(1,2)==obj1
elseif 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];
elseifMFstate{
6}(2,1)==obj6 && MFstate{
5}(1,2)==obj5
elseif 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
endifMFstate{
6}(1,2)==obj6 && MFstate{
2}(3,2)==obj2
num(1)=1;
end
ifMFstate{
6}(2,3)==obj6 && MFstate{
3}(1,2)==obj3
num(2)=1;
end
ifMFstate{
6}(3,2)==obj6 && MFstate{
1}(1,2)==obj1
num(3)=1;
end
ifMFstate{
6}(2,1)==obj6 && MFstate{
5}(1,2)==obj5
num(4)=1;
end
%---十字拼完
if sum(num)==4;
return;
endif num(1)==0
ifMFstate{
2}(1,2)==obj6 && MFstate{
4}(3,2)==obj2
[MFstate,TnMn]=disorganize(MFstate,'dlBL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(1,2)==obj2 && MFstate{
4}(3,2)==obj6
[MFstate,TnMn]=disorganize(MFstate,'b2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(2,3)==obj6 && MFstate{
3}(2,3)==obj2
[MFstate,TnMn]=disorganize(MFstate,'rdRb2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(2,3)==obj2 && MFstate{
3}(2,3)==obj6
[MFstate,TnMn]=disorganize(MFstate,'b');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(2,1)==obj6 && MFstate{
5}(2,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'LDlb2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(2,1)==obj2 && MFstate{
5}(2,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'B');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(3,2)==obj6 && MFstate{
6}(1,2)==obj2
[MFstate,TnMn]=disorganize(MFstate,'bLDlb2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,2)==obj6 && MFstate{
6}(2,3)==obj2
[MFstate,TnMn]=disorganize(MFstate,'rb');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,2)==obj2 && MFstate{
6}(2,3)==obj6
[MFstate,TnMn]=disorganize(MFstate,'r2db2Dr2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(1,2)==obj6 && MFstate{
6}(3,2)==obj2
[MFstate,TnMn]=disorganize(MFstate,'f2dRbr');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(1,2)==obj2 && MFstate{
6}(3,2)==obj6
[MFstate,TnMn]=disorganize(MFstate,'f2d2b2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,2)==obj6 && MFstate{
6}(2,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'LB');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,2)==obj2 && MFstate{
6}(2,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'L2Db2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(3,2)==obj2 && MFstate{
4}(2,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'Db2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(3,2)==obj6 && MFstate{
4}(2,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'lBL');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(2,3)==obj6 && MFstate{
1}(2,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'l2BL2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(2,3)==obj2 && MFstate{
1}(2,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'lDLB2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(3,2)==obj2 && MFstate{
4}(1,2)==obj6
[MFstate,TnMn]=disorganize(MFstate,'D2B2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(3,2)==obj6 && MFstate{
4}(1,2)==obj2
[MFstate,TnMn]=disorganize(MFstate,'dRbr');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(2,3)==obj6 && MFstate{
3}(2,1)==obj2
[MFstate,TnMn]=disorganize(MFstate,'RdrB2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(2,3)==obj2 && MFstate{
3}(2,1)==obj6
[MFstate,TnMn]=disorganize(MFstate,'fd2FB2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(3,2)==obj2 && MFstate{
4}(2,3)==obj6
[MFstate,TnMn]=disorganize(MFstate,'dB2');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
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);
ifMFstate{
1}(2,3)==obj1 && MFstate{
3}(2,1)==obj3
num(1)=1;
end
ifMFstate{
3}(2,3)==obj3 && MFstate{
2}(2,3)==obj2
num(2)=1;
end
ifMFstate{
2}(2,1)==obj2 && MFstate{
5}(2,1)==obj5
num(3)=1;
end
ifMFstate{
1}(2,1)==obj1 && MFstate{
5}(2,3)==obj5
num(4)=1;
end
%---第二层拼完
if sum(num)==4;
return;
endif num(1)==0
ifMFstate{
1}(2,3)==obj3 && MFstate{
3}(2,1)==obj1
[MFstate,TnMn]=disorganize(MFstate,'rURUFufUrURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(2,3)==obj3 && MFstate{
2}(2,3)==obj1
[MFstate,TnMn]=disorganize(MFstate,'ArURUFufarURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(2,3)==obj1 && MFstate{
2}(2,3)==obj3
[MFstate,TnMn]=disorganize(MFstate,'ArURUFufauFufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(2,1)==obj3 && MFstate{
5}(2,1)==obj1
[MFstate,TnMn]=disorganize(MFstate,'a2rURUFufA2urURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(2,1)==obj1 && MFstate{
5}(2,1)==obj3
[MFstate,TnMn]=disorganize(MFstate,'a2rURUFufA2U2FufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(2,1)==obj1 && MFstate{
5}(2,3)==obj3
[MFstate,TnMn]=disorganize(MFstate,'arURUFufAu2rURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(2,1)==obj3 && MFstate{
5}(2,3)==obj1
[MFstate,TnMn]=disorganize(MFstate,'arURUFufAUFufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,2)==obj3 && MFstate{
6}(2,3)==obj1
[MFstate,TnMn]=disorganize(MFstate,'UFufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(3,2)==obj3 && MFstate{
6}(1,2)==obj1
[MFstate,TnMn]=disorganize(MFstate,'FufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,2)==obj3 && MFstate{
6}(2,1)==obj1
[MFstate,TnMn]=disorganize(MFstate,'uFufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
1}(1,2)==obj3 && MFstate{
6}(3,2)==obj1
[MFstate,TnMn]=disorganize(MFstate,'u2FufurUR');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
3}(1,2)==obj1 && MFstate{
6}(2,3)==obj3
[MFstate,TnMn]=disorganize(MFstate,'u2rURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
2}(3,2)==obj1 && MFstate{
6}(1,2)==obj3
[MFstate,TnMn]=disorganize(MFstate,'UrURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
5}(1,2)==obj1 && MFstate{
6}(2,1)==obj3
[MFstate,TnMn]=disorganize(MFstate,'rURUFuf');
TurnManu=[TurnManu;
TnMn];
elseifMFstate{
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~=1
flg=is10ok(MFstate);
if flg==1
break;
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);
end
if flg==1
break;
elseif flg==2
if num(4)==1
[MFstate,TnMu]=disorganize(MFstate,'a');
TurnManu=[TurnManu;
TnMu];
end
elseif 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:4
num(n) = isfit(A(n,:),B(n,:));
end
if sum(num)==4
flg=1;
elseif num(1)==1
flg=2;
elseif num(2)==1
flg=3;
elseif num(3)==1
flg=4;
elseif num(4)==1
flg=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:3
for nn=1:3
if MFstate{
6}(n,nn)==MFstate{
6}(2,2)
num=num+1;
end
end
endif num==9
return;
%顶面恢复完成
elseif num==5
while (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==6
while (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==7
Tn=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
推荐阅读
- 机器学习系列文章|【晨读算法】为什么经常看到使用朴素贝叶斯公式的时候把分母忽略了()
- 深度学习|Pytorch总结五之 模型选择、?拟合和过拟合
- 算法|1357篇ECCV 2020论文打包下载!奖项公布(李飞飞高徒获最佳论文奖)
- 激光定位原理的理解
- python|力扣 leetcode 1319. 连通网络的操作次数 (python)并查集模板快速解及树的高效解
- Java算法及JDK源码探究|Java 递归: 八皇后问题(回溯算法)
- 拓端tecdat|【视频】为什么要处理缺失数据(如何R语言中进行缺失值填充?)
- mlr3绘制校准曲线
- mlr3实现二分类资料多个模型评价和比较