set N := 1..9; set DATA within N cross N cross N; var x {(i,j,k) in N cross N cross N} binary; # =1 if cell (i,j) takes value k minimize nothing: 0; # sudoku is just a feasibility problem subject to Columns{j in N, k in N}: sum{i in N} x[i,j,k] = 1; subject to Rows{i in N, k in N}: sum{j in N} x[i,j,k] = 1; subject to Squares{p in 1..3, q in 1..3, k in N}: sum{j in (3*p -2) ..3*p} sum{i in (3*q -2)..3*q} x[i,j,k] = 1; subject to all_filled{i in N, j in N}: sum{k in N} x[i,j,k] = 1; subject to known{(i,j,k) in DATA}: x[i,j,k] = 1; solve; display x; # immediato da scrivere ma non da leggere for{i in N} { for{j in N} printf "%d ", sum{k in N} k*x[i,j,k]; printf "\n"; }