# Model name  : strimko.mod
# Description : solves Strimko puzzles  
# Written by  : Martin Chlond
# Date written: 27/9/13

param n;

set N := 1..n;
set S := {N,N,N};
set C := N cross N;

set P{k in 1..n}, within C default {{},{}};

var x{S} binary;   # x[i,j,k] = 1 if {i,j}=k, else 0

param G{i in N,j in N}, default 0;
param g{i in N,j in N,k in N} binary := if G[i,j] = k then 1 else 0;

subject to

# force given cells
fg{i in N,j in N,k in N}: x[i,j,k] >= g[i,j,k];

# each cell contains one digit only
eccodo{(i,j) in C}: sum{k in N} x[i,j,k] = 1;

# each digit used once in each row
eduor{i in N,k in N}: sum{j in N} x[i,j,k] = 1;

# each digit used once in each column
eduoc{j in N,k in N}: sum{i in N} x[i,j,k] = 1;

# each digit use once in each subset
eduos{k in N,p in N}: sum{(i,j) in P[p]} x[i,j,k] = 1;

solve;

for {i in N} {
  for{j in N}: {
	printf sum{k in N} k*x[i,j,k];
	printf " ";
  }
  printf "\n";
}

data;

# http://www.puzzles.com/projects/StrimkoPrevious.htm - set 186

param n := 5;

set P[1] := 1,1  2,2  3,2  2,3  1,4;
set P[2] := 3,1  2,1  1,2  1,3  2,4;
set P[3] := 4,1  5,1  5,2  5,3  4,3;
set P[4] := 4,2  3,3  3,4  2,5  1,5;
set P[5] := 4,4  5,4  5,5  4,5  3,5;

param G:   1 2 3 4 5 :=
         1 . . . . .
         2 . . . 3 .
         3 . 4 . 5 .
         4 . 2 . . .
         5 . . . . .;

end;
