主頁 >  其他 > 三階魔方自動求解及動態可視化matlab代碼

三階魔方自動求解及動態可視化matlab代碼

2021-01-24 21:13:14 其他

三階魔方自動求解及動態可視化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;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



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251708.html

標籤:其他

上一篇:淺談漢諾塔問題,以及對其遞回的分析

下一篇:極客日報第 54 期:騰訊、火絨分別回應關于“QQ 讀取瀏覽器歷史記錄;俄羅斯加密交易所遭黑客攻擊關閉;華為商城全面下架榮耀產品;

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more