Rubik cube 

J'ai bien aimé ce super solveur  mais depuis,

 

J'ai découvert le site de M Kociemba qui montre que n'importe quel cube peut être résolu en au plus 20 coups!...
et qui propose un source java de son algorithme "Two phase" ....

kociemba

Ce solveur permet de résoudre "un vrai cube physique",
la saisie étant trés aisée...
A noter aussi sa rapidité...
J'ai utilisé ce solveur Java avec mon simulateur Delphi...
Une vidéo du résultat...
delphijava
Les données (cube et solution) sont échangées avec le presse papier
Un jour je ferai tout en java.....
Bein...., finalement ca a été plus rapide que je ne pensais
surtout vis à vis des threads java...


le site de M RandelsHofer  est aussi un incontournable

applet/monRubik.htmlEncore un bon site, avec ce solveur en ligne

Au préalable et beaucoup plus modestement, je me suis amusé avec celui-la, dont on peut beaucoup plus facilement calculer les 3.674.160 possibilités

r2x2x2

Ma procédure, en gros on gère deux listes CubesTrouves et CubesAExaminer,
Pour chaque cube à examiner on applique les 6 mouvements possibles, si les cubes générés ne sont pas dans la liste des trouvés on les ajoute dans ces deux listes
On supprime le cube examiné de la liste CubesAExaminer et on recommence jusqu'à ce qu'il n'ait plus de cubes à éxaminer...

procedure TFrmSolve.BtnCalculeToutClick(Sender: TObject);
Var CubesTrouves:Array[0..Nmax-1] Of TStringlist;//tableau de 6*6*6*6 listes pour accélérer le find(cs,c)...
   AExaminer:TList;
    pc:PCubeEtSuivi;
    NouveauCube,CubeGenerateur:UnCube;
    i,l,c:Integer;
    cs:String[24];
    Chemin:String;
    CubeComplet:CubeEtSuivi;
    n:LongInt;
    ASauvegarder:TStringList;
    F:TextFile;
begin
//ShowMessage('3.674.160 configurations calculées en 1h environ !...');Exit;
For i:=0 To NMax-1 Do Begin
  CubesTrouves[i]:=TStringList.Create;
  CubesTrouves[i].Sorted:=True;
End;
cs:='';For l:=1 To 4 Do For c:=1 to 6 Do cs:=cs+Cube[c,l];
l:=HashCode(Cube);
CubesTrouves[l].Add(cs);
Asauvegarder:=TStringList.Create;
New(pc);
pc^.Cube:=Cube;
Chemin:='';
pc^.Suivi:=Chemin;
ASauvegarder.Add(cs+';'+Chemin);
AExaminer:=TList.Create;
AExaminer.Add(pc);
Memo1.Lines.Add(IntToStr(AExaminer.Count));
n:=1;
While (AExaminer.Count>0) Do Begin
  CubeComplet:=CubeEtSuivi(AExaminer.Items[0]^);
  CubeGenerateur:=CubeComplet.Cube;
  AExaminer.Delete(0);
  For i:=1 to 6 Do Begin
        Case i Of
           1:NouveauCube:=MvtC4(CubeGenerateur);
           2:NouveauCube:=MvtL1(CubeGenerateur);
           3:NouveauCube:=MvtL4(CubeGenerateur);
           4:NouveauCube:=MvtC4Bis(CubeGenerateur);
           5:NouveauCube:=MvtL1Bis(CubeGenerateur);
           6:NouveauCube:=MvtL4Bis(CubeGenerateur);
        End;
       cs:='';For l:=1 To 4 Do For c:=1 to 6 Do cs:=cs+NouveauCube[c,l];//Cube2String
       l:=HashCode(NouveauCube);
       If  Not CubesTrouves[l].Find(cs,c)//le nouveau cube n'est pas encore dans la liste des trouvés
       Then Begin
            New(pc);
            pc^.Cube:=NouveauCube;
            Chemin:=CubeComplet.Suivi+IntToStr(i);
            pc^.Suivi:=Chemin;
            AExaminer.Add(pc);
            c:=CubesTrouves[l].Add(cs);
            ASauvegarder.Add(cs+';'+Chemin+';');
            inc(n);
            if (n mod 10000)=0 Then Caption:='Trouvés '+IntToStr(n)+' A examiner: '+IntToStr(AExaminer.Count);
       End;
       End;
End;
Memo1.Lines.Add('AExaminer: '+IntToStr(AExaminer.Count));
Memo1.Lines.Add('Trouvés: '+IntToStr(n));
ASauvegarder.Sort;
Caption:='Sauvegarde...';
AssignFile(F,'TrouvesBis.txt');
Rewrite(F);
For i:=0 To ASauvegarder.Count-1 Do Writeln(F, ASauvegarder[i]);
CloseFile(F);
Caption:='Fin de la recherche...';
end;