| Cube.Color(i,C0.RotLayerCube(i,5));
end
C1=C0;
C1.Color(:)=0;
for i=1:6
C1.Color(i,C0.RotLayerCube(i,[1:4 6:9]))=1;
end
if Cube.bFullCube
for i=1:6
iCube=Cube.iMid(i);
z=Cube.iExtraFaces(i,:);
C0.Color(z,C0.iMid(i))=C0.Color(C0.iMidInd( |
function [moves,n,nNOK]=solverbbf(cube,moves,N)
% SOLVERBBF - Solve Rubik's cube using bruteforce recursive algorithm
% [moves,OK]=solverbbf([Cube[,N])
% or
% [moves,OK]=solverbbf(N[,Cube])
% with Cube : the definition of the Cube (from Rubik). If not given,
% this is searched in a window.
% N : the maximum number of recursive calls (default 3)
%
% This function is also used recursively, with other input and output
% arguments.
% remark : in later Matlab versions, this can be done nicer (using subfunctions)
% but this is made with Matlab 5.2, so it was choosen to work this way.
% ("this way" means:
% using persistent data
% made in the main function (not available in subfunctions)
% )
%!!!kan uitgebreid worden naar beperkt zoeken (enkel bepaalde delen, zoals 1 of 2 lagen)
% ook eenvoudig uit te breiden naar fullcube (maar werd niet gedaan)!
persistent M CUBE0
if nargin<=2
Cube=[];
N=3;
if nargin
if isstruct(cube)
Cube=cube;
elseif isnumeric(cube)
if numel(cube)==1
N=cube;
else
error('Wrong input')
end
end
end
if nargin>1
if isstruct(moves)
Cube=moves;
elseif isnumeric(moves)
if numel(moves)==1
N=moves;
else
error('Wrong input')
end
end
end
if isempty(Cube)
Cube=FindRubikCube;
end
% Use of Rubik-moves to initialise move-arrays
C0=InitCube(Cube);
% set the right colors for the current cube
for i=1:6
C0.Color(i,C0.RotLayerCube(i,:)) = Cube.Color(i,C0.RotLayerCube(i,5));
end
C1=C0;
C1.Color(:)=0;
for i=1:6
C1.Color(i,C0.RotLayerCube(i,[1:4 6:9]))=1;
end
if Cube.bFullCube
for i=1:6
iCube=Cube.iMid(i);
z=Cube.iExtraFaces(i,:);
C0.Color(z,C0.iMid(i))=C0.Color(C0.iMidInd(z));
%C0.Color(Cube.iExtraFaces(i,:),iCube)=C0.Color(Cube.iExtraFaces(i,:),iCube);
C1.Color(Cube.iExtraFaces(i,:),iCube)=1;
end
end
iP=find(C1.Color);
Nfield=length(iP);
C1.Color(iP)=(1:Nfield)';
M=zeros(Nfield,18);
i=0;
for Axe=1:3
for Side=[-1 1]
for Direction=[-1 1 2]
i=i+1;
if Direction<2
C=RotateLayer([],C1,Axe,Side,Direction,0);
else
C=RotateLayer([],C,Axe,Side,1,0);
end
M(:,i)=C.Color(iP);
end
end
end
CUBE0=C0.Color(iP);
moves=zeros(N,3); % determines the maximum depth
[moves,n,nNOK]=solverbbf(Cube.Color(iP),moves,0);
if nNOK
moves=zeros(0,3);
n=false;
else
moves=moves(1:n,:);
n=true;
end
return
end
nNOK=sum(cube~=CUBE0);
if nNOK==0
n=N;
return
end
nMoves=size(moves,1);
if N>=nMoves
n=0;
return
end
cube0=cube;
N=N+1;
if N<nMoves
nD=3;
else
nD=2;
end
for Axe=0:2
moves(N,1)=Axe+1;
iA=Axe*6;
for Side=0:1
moves(N,2)=Side*2-1;
if N==1|moves(N-1)~=moves(N)|moves(N,2)>moves(N-1,2)
iS=iA+Side*3;
N1=N;
for Direction=1:nD
if Direction<3
moves(N,3)=Direction*2-3;
else
N1=N+1;
moves(N1,:)=moves(N,:);
end
%disp([N N1 Axe Side Direction moves(N,:)])
cube(:)=cube0(M(:,iS+Direction));
[moves,n,nNOK]=solverbbf(cube,moves,N1);
if nNOK==0
return
end
end
end
end
end
|
|