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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| Program ResSecteur;
{$APPTYPE CONSOLE}
uses SysUtils;
var Sud : array[1..9,1..9] of integer;
chiffre : integer;
modif : boolean;
Function VComplet : boolean;
var I, J : integer;
Begin
VComplet := False;
For I:=1 to 9 do
For J:=1 to 9 do
If(Sud[I,J]=0) Then Exit;
VComplet := True;
End;
Function VerifLigne(I,chi:integer) : boolean;
var J : integer;
Begin
VerifLigne := False;
For J:=1 to 9 do
If (chi=Sud[I,J]) Then Exit;
VerifLigne := True;
End;
Function VerifColonne(J,chi:integer) : boolean;
var I : integer;
Begin
VerifColonne := False;
For I:=1 to 9 do
If (chi=Sud[I,J]) Then Exit;
VerifColonne := True;
End;
Function VerifSecteur(I,J,chi:integer) : boolean;
var II, JJ, SI, SJ : integer;
Begin
SI:=((I-1) div 3)*3 +2;
SJ:=((J-1) div 3)*3 +2;
VerifSecteur := False;
For II:=SI-1 to SI+1 do
For JJ:=SJ-1 to SJ+1 do
If (chi=Sud[II,JJ]) Then Exit;
VerifSecteur := True;
End;
Procedure ResSect(chi:integer);
var I1, J1, I2, J2, I3, J3, S : integer;
Begin
For I1:=1 to 9 do
For J1:=1 to 9 do
If ((I1 in [2,5,8]) and (J1 in [2,5,8]) and VerifSecteur(I1,J1,chi)) Then
Begin
S:=0;
For I2:=I1-1 to I1+1 do
For J2:=J1-1 to J1+1 do
If ((Sud[I2,J2]=0) and VerifLigne(I2,chi) and VerifColonne(J2,chi)) Then
Begin
S:=S+1;
I3:=I2;
J3:=J2;
End;
If (S=1) Then
Begin
Sud[I3,J3]:=chi;
Modif:=True;
End;
End;
End;
Procedure Affiche_grille;
var I, J : integer;
Begin
For I:=1 to 9 do
Begin
For J:=1 to 9 do Write(Sud[I,J],' ');
Writeln;
End;
Writeln;
End;
begin { corps du programme }
Sud[1,1]:=0; Sud[1,2]:=1; Sud[1,3]:=8; Sud[1,4]:=0; Sud[1,5]:=3; Sud[1,6]:=2; Sud[1,7]:=6; Sud[1,8]:=5; Sud[1,9]:=0;
Sud[2,1]:=5; Sud[2,2]:=9; Sud[2,3]:=7; Sud[2,4]:=4; Sud[2,5]:=8; Sud[2,6]:=6; Sud[2,7]:=1; Sud[2,8]:=2; Sud[2,9]:=3;
Sud[3,1]:=2; Sud[3,2]:=3; Sud[3,3]:=6; Sud[3,4]:=7; Sud[3,5]:=1; Sud[3,6]:=5; Sud[3,7]:=9; Sud[3,8]:=4; Sud[3,9]:=8;
Sud[4,1]:=9; Sud[4,2]:=2; Sud[4,3]:=3; Sud[4,4]:=5; Sud[4,5]:=7; Sud[4,6]:=4; Sud[4,7]:=8; Sud[4,8]:=1; Sud[4,9]:=0;
Sud[5,1]:=7; Sud[5,2]:=8; Sud[5,3]:=5; Sud[5,4]:=1; Sud[5,5]:=6; Sud[5,6]:=3; Sud[5,7]:=4; Sud[5,8]:=9; Sud[5,9]:=0;
Sud[6,1]:=1; Sud[6,2]:=6; Sud[6,3]:=4; Sud[6,4]:=2; Sud[6,5]:=9; Sud[6,6]:=8; Sud[6,7]:=3; Sud[6,8]:=7; Sud[6,9]:=5;
Sud[7,1]:=3; Sud[7,2]:=4; Sud[7,3]:=9; Sud[7,4]:=8; Sud[7,5]:=2; Sud[7,6]:=7; Sud[7,7]:=5; Sud[7,8]:=0; Sud[7,9]:=1;
Sud[8,1]:=6; Sud[8,2]:=7; Sud[8,3]:=1; Sud[8,4]:=3; Sud[8,5]:=5; Sud[8,6]:=9; Sud[8,7]:=2; Sud[8,8]:=0; Sud[8,9]:=4;
Sud[9,1]:=8; Sud[9,2]:=5; Sud[9,3]:=2; Sud[9,4]:=6; Sud[9,5]:=4; Sud[9,6]:=1; Sud[9,7]:=7; Sud[9,8]:=3; Sud[9,9]:=9;
Affiche_grille;
Repeat
modif:=False;
For chiffre:=1 to 9 do ResSect(chiffre);
Until not(modif);
Affiche_grille;
If VComplet Then writeln('La grille est remplie.')
Else writeln('La grille n''est pas remplie.');
Readln;
end. |
Partager