1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
//Declaration de mes types personels :
type
Tpo = 1..9;
Tpos = set of Tpo;
Tcase = {packed} record //Le record ne me sert a rien pour l'instant mais c'est au cas ou...
pos:Tpos;
end;
Tjob=array [1..9] of ^Tcase; //tableau de pointeurs vers des Tcases
//Declaration de mon tableau :
var
tab:array[1..9,1..9] of Tcase;
//Cette procedure se charge d'envoyer tous les groupes de 9 cases a la fonction qui élimine les hipotheses :
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,x_bloc,y_bloc:integer;
job:Tjob;
begin
if not loadgrid then exit; //charge la grille "utilisateur"
//resoud les lignes
for x:=1 to 9 do begin
for y:=1 to 9 do
job[y]:=@Tab[x,y];
Resolve(job,1,[]);
end;
//resoud les colones
for y:=1 to 9 do begin
for x:=1 to 9 do
job[x]:=@Tab[x,y];
Resolve(job,1,[]);
end;
//resoud les blocs
for X_bloc:=0 to 2 do
for Y_bloc:=0 to 2 do
begin
for x:=(X_bloc*3+1) to (X_bloc*3+3) do
for y:=(Y_bloc*3+1) to (Y_bloc*3+3) do
job[3*(x-3*X_bloc)+y-3*Y_Bloc-3]:=@Tab[x,y];
Resolve(job,1,[]);
end;
drawtab;//Affiche la table modifiée
end;
//Voici la procedure recursive qui analyse toutes les combinaisons de cases et suprime les hypothese.
function TForm1.resolve(job:TJob; min:integer; combi_ec:Tpos):integer;
var
i,m:byte;
ESomme,combi:Tpos;
begin
// pour m de min(recursif) à nombre de cases du tableau de pointeurs.
for m:=min to High(job) do begin
Combi:=Combi_ec+[m];
//sort si le nombre d'élements de combi est égal au nombre de cases de job
if countpos(Combi)=High(job) then exit;
resolve(job,m+1,Combi);
//debut:code pour chaque combinaison (combi:Tpos)
//recupere le nombre de possibilités
Esomme:=[];
for i:=1 to High(job) do
if i in combi then
Esomme:=Esomme+job[i].pos;
if countpos(Esomme)=countpos(combi) then begin
//suppression des possibilités
for i:=1 to High(job) do
if not (i in combi) then job[i].pos:=job[i].pos-ESomme;
end;
//fin:code pour chaque combinaison (combi:Tpos)
end;
end;
//me permet de recuperer le nombre d'element d'un ensemble de possibilités.
function Tform1.CountPos(E:Tpos):byte;
var i:integer;
begin
result:=0;
for i:=1 to 9 do
if i in E then inc(result);
end; |
Partager