# Sudoku Rätsel

set Z := {1..9}; # Zahl
set I := {1..9}; # Zeile
set J := {1..9}; # Spalte
set B := {0,3,6}; # Bloecke ("Anfangswerte")
set Ib := {1..3}; # Blockzeilen
set Jb := {1..3}; # Blockspalten

param vZ {I, J}; # vorgegebene Zahl

var y {Z,I,J} binary; # y wird 1, wenn z in Z ist

#Optimalit�tsbedingung:
minimize SUMME: sum {z in Z, i in I, j in J} 0*y[z,i,j];

#Restriktionen:
s.t. Zeile {z in Z, i in I}: sum {j in J} y[z,i,j] = 1; # Restriktion 1
s.t. Spalte {z in Z, j in J}: sum {i in I} y[z,i,j] = 1; # Restriktion 2
s.t. Block {b1 in B, b2 in B, z in Z}: sum {ib in Ib, jb in Jb} y[z,b1+ib,b2+jb]= 1; # Restriktion 3 
s.t. Zelle {i in I, j in J}: sum {z in Z} y[z,i,j] = 1; # Restriktion 4

# Vorgegebene Zahlen
s.t. vZinZelle {i in I, j in J: vZ[i,j]!=0}: y[vZ[i,j],i,j] = 1; # die Zellen mit vorgegebenen Zahlen werden eingebunden
