三階魔方自動求解及動態視覺化matlab程式碼
阿新 • • 發佈:2021-01-24
三階魔方自動求解及動態視覺化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
- 定義隨機打亂和逆序恢復的函式,測試確保人為給出旋轉公式,魔方能正確旋轉;
- 編寫按公式恢復魔方的函式,記錄恢復過程的旋轉過程公式(取一個魔方一邊擰一邊程式設計,考慮所有情況)
1):頂層拼十字:簡化為4次恢復頂面稜中小塊(不破壞已恢復的結果)
2):頂層拼四角:簡化為4次恢復頂面的角小塊(不破壞已恢復的結果)
第一層恢復完成,剩下可按公式恢復魔方,把第一層置底
3):二層拼稜角:簡化為4次恢復二層稜角小塊(不破壞已恢復的結果)
4):按公式頂層拼十字
5):按公式頂層四角對應恢復
6):按公式頂面同色恢復
7):按公式頂面稜邊恢復
第三層恢復完成 - 編寫一個公式簡化的函式,如消除相鄰正反操作、消除4次相同操作、3次同向旋轉替換為一次反向旋轉操作、不相關跳躍旋轉整合等,未能考慮所有可化簡的情況,還未能化簡為最少旋轉步數公式。時間精力有限,待以後有新思路的時候再玩。
總結
很多指令都是現查現用的,程式設計模組化,過程分解,程式設計週期較長,編完以後,整體思路清晰,但單獨模組缺少註釋,不好看懂,特別是手動旋轉對應程式設計部分,時間久了容易忘記。這是2019年1月編的程式碼(忘記了具體參考過哪些程式碼了),現在整理下思路,這裡三階魔方恢復演算法是普通的按公式還原演算法,主要難點在於判斷魔方的狀態,我程式設計的過程中是實際拿著個魔方一邊轉一邊進行狀態觀察遍歷,方法比較笨,可以實現自動魔方還原,但是還原步驟較多,程式中通過增加一些函式進行了步驟的簡化
但是簡化結果並不徹底,需要更高階的簡化函式,或高階的魔方恢復演算法。
思考
如果能夠用快速相機記錄並識別魔方高手旋轉魔方的方法,通過機器學習、聚類、遷移等思想,改善演算法,資料即演算法?如果沒有如果,給定初始的演算法,能不能讓演算法自己通過執行自學習,更新演算法,或者產生模擬高階的資料用於機器學習?感覺這會不會是一個很好的案例?資料為王?演算法為王?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'];
end
TurnManu=[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'];
end
TurnManu=[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];
end
TurnManu=[TurnManu;('- ').'];
%---步驟4:頂稜中恢復
[MFstate,TnMn]=recover3FArris(MFstate);TurnManu=[TurnManu;TnMn];
while isempty(TnMn)==0
[MFstate,TnMn]=recover3FArris(MFstate);TurnManu=[TurnManu;TnMn];
end
end
% ---定義魔方整體旋轉行為---改變朝前面
% 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);
end
elseif TurnManu=='A'
[az,el]=view();
azStep=linspace(0,90,stepNum);
for n=1:stepNum
view(az+azStep(n),el);pause(tSec);
end
elseif 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);
end
elseif 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
end
for 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);
end
elseif 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
end
for 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);
end
elseif 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
end
for 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);
end
elseif 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
end
for 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);
end
elseif 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);
end
for kkk=1:3
h=hds{4}{1,kkk};
rotate(h,direct,azStep,origin);
end
for 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);
end
elseif 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);
end
for kkk=1:3
h=hds{4}{3,kkk};
rotate(h,direct,azStep,origin);
end
for 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);
end
end
end
% ---定義魔方整體旋轉行為---改變朝前面
% 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
end
function 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);
end
for 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)<N0)
% TurnManu=simplifyTurnManu(TurnManu);
% N0=length(TurnManu);
% end
%
% end
%% 簡化顯示旋轉魔方操作,將重複2次操作顯示為操作2
function TurnManu=DispTurnManu(TurnManu,dispFlag)
if nargin==1
dispFlag=0;
end
if size(TurnManu,2)>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);
if MFstate{6}(1,1)==obj6 && MFstate{2}(3,1)==obj2 && MFstate{5}(1,1)==obj5
num(1)=1; end
if MFstate{6}(1,3)==obj6 && MFstate{2}(3,3)==obj2 && MFstate{3}(1,3)==obj3
num(2)=1; end
if MFstate{6}(3,3)==obj6 && MFstate{1}(1,3)==obj1 && MFstate{3}(1,1)==obj3
num(3)=1; end
if MFstate{6}(3,1)==obj6 && MFstate{1}(1,1)==obj1 && MFstate{5}(1,3)==obj5
num(4)=1; end
%---4角拼完
if sum(num)==4; return;end
if num(1)==0
if 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)==obj2
elseif 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)==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];
elseif MFstate{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];
elseif MFstate{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
end
if MFstate{6}(1,2)==obj6 && MFstate{2}(3,2)==obj2
num(1)=1; end
if MFstate{6}(2,3)==obj6 && MFstate{3}(1,2)==obj3
num(2)=1; end
if MFstate{6}(3,2)==obj6 && MFstate{1}(1,2)==obj1
num(3)=1; end
if MFstate{6}(2,1)==obj6 && MFstate{5}(1,2)==obj5
num(4)=1; end
%---十字拼完
if sum(num)==4; return;end
if num(1)==0
if 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)==obj3
num(1)=1; end
if MFstate{3}(2,3)==obj3 && MFstate{2}(2,3)==obj2
num(2)=1; end
if MFstate{2}(2,1)==obj2 && MFstate{5}(2,1)==obj5
num(3)=1; end
if MFstate{1}(2,1)==obj1 && MFstate{5}(2,3)==obj5
num(4)=1; end
%---第二層拼完
if sum(num)==4; return;end
if num(1)==0
if 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~=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
end
function 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
end
function [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
end
function 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;
end
end
%% 頂面恢復
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
end
if 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];
end
end
%% 頂稜中恢復
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];
end
if 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