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" ....
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...
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
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;