Sudoku

Enunț:
Sudoku reprezintă un joc clasic în care este dat un tabel compus din 9 x 9 pătrățele, unite
la rândul său în 9 blocuri de mărime 3 x 3 ca în exemplul de mai jos. Unele pătrățele
conțin inițial câte o cifră cuprinsă între 1 și 9 inclusiv. Scopul jocului este de a completa
restul pătrățelelor libere cu cifre astfel încât fiecare linie, fiecare coloana și fiecare bloc 3
x 3 să conțină toate cifrele de la 1 la 9.
Se cere un program Prolog care să rezolve acest joc.

prolog_logo
Cod Sursa PROLOG

 

:- use_module(library(clpfd)).
sudoku(
A1, A2, A3, A4, A5, A6, A7, A8, A9,
B1, B2, B3, B4, B5, B6, B7, B8, B9,
C1, C2, C3, C4, C5, C6, C7, C8, C9,
D1, D2, D3, D4, D5, D6, D7, D8, D9,
E1, E2, E3, E4, E5, E6, E7, E8, E9,
F1, F2, F3, F4, F5, F6, F7, F8, F9,
G1, G2, G3, G4, G5, G6, G7, G8, G9,
H1, H2, H3, H4, H5, H6, H7, H8, H9,
I1, I2, I3, I4, I5, I6, I7, I8, I9
) :-
L = [ A1, A2, A3, A4, A5, A6, A7, A8, A9,
B1, B2, B3, B4, B5, B6, B7, B8, B9,
C1, C2, C3, C4, C5, C6, C7, C8, C9,
D1, D2, D3, D4, D5, D6, D7, D8, D9,
E1, E2, E3, E4, E5, E6, E7, E8, E9,
F1, F2, F3, F4, F5, F6, F7, F8, F9,
G1, G2, G3, G4, G5, G6, G7, G8, G9,
H1, H2, H3, H4, H5, H6, H7, H8, H9,
I1, I2, I3, I4, I5, I6, I7, I8, I9 ],
domain(L, 1, 9),
% RANDURI
all_different([A1, A2, A3, A4, A5, A6, A7, A8, A9]),
all_different([B1, B2, B3, B4, B5, B6, B7, B8, B9]),
all_different([C1, C2, C3, C4, C5, C6, C7, C8, C9]),
all_different([D1, D2, D3, D4, D5, D6, D7, D8, D9]),
all_different([E1, E2, E3, E4, E5, E6, E7, E8, E9]),
all_different([F1, F2, F3, F4, F5, F6, F7, F8, F9]),
all_different([G1, G2, G3, G4, G5, G6, G7, G8, G9]),
all_different([H1, H2, H3, H4, H5, H6, H7, H8, H9]),
all_different([I1, I2, I3, I4, I5, I6, I7, I8, I9]),
% COLOANE
all_different([A1, B1, C1, D1, E1, F1, G1, H1, I1]),
all_different([A2, B2, C2, D2, E2, F2, G2, H2, I2]),
all_different([A3, B3, C3, D3, E3, F3, G3, H3, I3]),
all_different([A4, B4, C4, D4, E4, F4, G4, H4, I4]),
all_different([A5, B5, C5, D5, E5, F5, G5, H5, I5]),
all_different([A6, B6, C6, D6, E6, F6, G6, H6, I6]),
all_different([A7, B7, C7, D7, E7, F7, G7, H7, I7]),
all_different([A8, B8, C8, D8, E8, F8, G8, H8, I8]),
all_different([A9, B9, C9, D9, E9, F9, G9, H9, I9]),
% PATRATE 3×3
all_different([A1, A2, A3, B1, B2, B3, C1, C2, C3]),
all_different([A4, A5, A6, B4, B5, B6, C4, C5, C6]),
all_different([A7, A8, A9, B7, B8, B9, C7, C8, C9]),
all_different([D1, D2, D3, E1, E2, E3, F1, F2, F3]),
all_different([D4, D5, D6, E4, E5, E6, F4, F5, F6]),
all_different([D7, D8, D9, E7, E8, E9, F7, F8, F9]),
all_different([G1, G2, G3, H1, H2, H3, I1, I2, I3]),
all_different([G4, G5, G6, H4, H5, H6, I4, I5, I6]),
all_different([G7, G8, G9, H7, H8, H9, I7, I8, I9]),
labeling([], L),
afiseaza(L).
afiseaza(L) :- afiseaza(1,L).
afiseaza(X,[A|L]) :- X<81 -> write(A), Z is X mod 9 , ( Z=0,X>0 -> write(‘\n’) ; write(‘,’)
) , afiseaza(X+1,L) ; write(A) , write(‘\n’) .
% exemplu din enunt
joc1 :- sudoku(
_,4,_,1,_,3,5,_,_,
7,_,_,_,_,_,_,1,8,
9,_,1,6,_,8,3,_,_,
1,_,_,4,_,_,6,_,_,
_,8,_,2,_,6,_,9,_,
_,_,2,_,_,9,_,_,4,
_,_,7,9,_,1,4,_,6,
4,9,_,_,_,_,_,_,3,
_,_,6,3,_,7,_,2,_
).
joc2 :- sudoku(
_,4,3,_,8,_,2,5,_,
6,_,_,_,_,_,_,_,_,
_,_,_,_,_,1,_,9,4,
9,_,_,_,_,4,_,7,_,
_,_,_,6,_,8,_,_,_,
_,1,_,2,_,_,_,_,3,
8,2,_,5,_,_,_,_,_,
_,_,_,_,_,_,_,_,5,
_,3,4,_,9,_,7,1,_
).
joc3 :- sudoku(
_,_,_,3,_,_,4,6,_,
_,_,9,8,_,_,_,_,2,
1,4,8,_,_,_,_,_,_,
_,1,3,5,8,_,_,4,_,
8,5,_,_,_,_,_,1,3,
_,2,_,_,1,3,7,8,_,
_,_,_,_,_,_,3,2,1,
5,_,_,_,_,_,7,8,_,
_,8,1,_,_,9,_,_,_
).
joc4 :- sudoku(
_,_,_,2,_,_,_,9,_,
6,3,_,_,4,_,_,_,8,
_,_,9,6,_,_,_,1,_,
_,7,6,_,_,_,_,_,9,
_,_,1,4,_,2,8,_,_,
3,_,_,_,_,_,1,7,_,
_,2,_,_,_,6,7,_,_,
9,_,_,_,2,_,_,5,1,
_,6,_,_,_,1,_,_,_
).
% un tabel curat
joc0 :- sudoku(
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_
).

Interogări:

?- joc1.
2,4,8,1,7,3,5,6,9
7,6,3,5,9,4,2,1,8
9,5,1,6,2,8,3,4,7
1,7,9,4,8,5,6,3,2
5,8,4,2,3,6,7,9,1
6,3,2,7,1,9,8,5,4
3,2,7,9,5,1,4,8,6
4,9,5,8,6,2,1,7,3
8,1,6,3,4,7,9,2,5
?- joc2.
1,4,3,9,8,6,2,5,7
6,7,9,4,2,5,3,8,1
2,8,5,7,3,1,6,9,4
9,6,2,3,5,4,1,7,8
3,5,7,6,1,8,9,4,2
4,1,8,2,7,9,5,6,3
8,2,1,5,6,7,4,3,9
7,9,6,1,4,3,8,2,5
5,3,4,8,9,2,7,1,6
?- joc3.
no
?- joc4.
4,1,8,2,5,7,3,9,6
6,3,7,1,4,9,5,2,8
2,5,9,6,8,3,4,1,7
8,7,6,3,1,5,2,4,9
5,9,1,4,7,2,8,6,3
3,4,2,9,6,8,1,7,5
1,2,5,8,9,6,7,3,4
9,8,3,7,2,4,6,5,1
7,6,4,5,3,1,9,8,2
?- joc0.
1,2,3,4,5,6,7,8,9
4,5,6,7,8,9,1,2,3
7,8,9,1,2,3,4,5,6
2,1,4,3,6,5,8,9,7
3,6,5,8,9,7,2,1,4
8,9,7,2,1,4,3,6,5
5,3,1,6,4,2,9,7,8
6,4,2,9,7,8,5,3,1
9,7,8,5,3,1,6,4,2

Leave a comment