Download
%
% Killer Sudoku in MiniZinc.
%
% Killer sudoku in Comet.
% http://en.wikipedia.org/wiki/Killer_Sudoku
% """
% Killer sudoku (also killer su doku, sumdoku, sum doku, addoku, or
% samunamupure) is a puzzle that combines elements of sudoku and kakuro.
% Despite the name, the simpler killer sudokus can be easier to solve
% than regular sudokus, depending on the solver's skill at mental arithmetic;
% the hardest ones, however, can take hours to crack.
% ...
% The objective is to fill the grid with numbers from 1 to 9 in a way that
% the following conditions are met:
% * Each row, column, and nonet contains each number exactly once.
% * The sum of all numbers in a cage must match the small number printed
% in its corner.
% * No number appears more than once in a cage. (This is the standard rule
% for killer sudokus, and implies that no cage can include more
% than 9 cells.)
% In 'Killer X', an additional rule is that each of the long diagonals
% contains each number once.
% """
% Here we solve the problem from the Wikipedia page, also shown here
% http://en.wikipedia.org/wiki/File:Killersudoku_color.svg
% Note, this model is based on the generalized KenKen model:
% http://www.hakank.org/comet/kenken2.co
% Killer Sudoku is simpler in that the only mathematical operation is
% summation.
% The output is:
% 2 1 5 6 4 7 3 9 8
% 3 6 8 9 5 2 1 7 4
% 7 9 4 3 8 1 6 5 2
% 5 8 6 2 7 4 9 3 1
% 1 4 2 5 9 3 8 6 7
% 9 7 3 8 1 6 4 2 5
% 8 2 1 7 3 9 5 4 6
% 6 5 9 4 2 8 7 1 3
% 4 3 7 1 6 5 2 8 9
%
% Also, see the following models:
% Comet: http://www.hakank.org/comet/killer_sudoku.co
% MiniZinc: http://www.hakank.org/minizinc/kenken2.mzn
% MiniZinc: http://www.hakank.org/minizinc/kakuro.mzn
%
% This MiniZinc model was created by Hakan Kjellerstrand, hakank@gmail.com
% See also my MiniZinc page: http://www.hakank.org/minizinc
%
% Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/
include "globals.mzn";
int: n = 9;
array[1..n, 1..n] of var 1..9: x;
%
% state the problem
%
% For a better view of the problem, see
% http://en.wikipedia.org/wiki/File:Killersudoku_color.svg
%
int: num_p = 29; % number of segments
int: num_hints = 4; % number of hints per segments (that's max number of hints)
int: max_val = 100;
array[1..num_p, 1..2*num_hints+1] of 0..max_val: P =
array2d(1..num_p, 1..2*num_hints+1, [
1,1, 1,2, 0,0, 0,0, 3,
1,3, 1,4, 1,5, 0,0, 15,
1,6, 2,5, 2,6, 3,5, 22,
1,7, 2,7, 0,0, 0,0, 4,
1,8, 2,8, 0,0, 0,0, 16,
1,9, 2,9, 3,9, 4,9, 15,
2,1, 2,2, 3,1, 3,2, 25,
2,3, 2,4, 0,0, 0,0, 17,
3,3, 3,4, 4,4, 0,0, 9,
3,6, 4,6, 5,6, 0,0, 8,
3,7, 3,8, 4,7, 0,0, 20,
4,1, 5,1, 0,0, 0,0, 6,
4,2, 4,3, 0,0, 0,0, 14,
4,5, 5,5, 6,5, 0,0, 17,
4,8, 5,7, 5,8, 0,0, 17,
5,2, 5,3, 6,2, 0,0, 13,
5,4, 6,4, 7,4, 0,0, 20,
5,9, 6,9, 0,0, 0,0, 12,
6,1, 7,1, 8,1, 9,1, 27,
6,3, 7,2, 7,3, 0,0, 6,
6,6, 7,6, 7,7, 0,0, 20,
6,7, 6,8, 0,0, 0,0, 6,
7,5, 8,4, 8,5, 9,4, 10,
7,8, 7,9, 8,8, 8,9, 14,
8,2, 9,2, 0,0, 0,0, 8,
8,3, 9,3, 0,0, 0,0, 16,
8,6, 8,7, 0,0, 0,0, 15,
9,5, 9,6, 9,7, 0,0, 13,
9,8, 9,9, 0,0, 0,0, 17
]);
% solve satisfy;
solve :: int_search([x[i,j] | i,j in 1..n], first_fail, indomain_min, complete) satisfy;
constraint
forall(i in 1..n) (
all_different([x[i,j] | j in 1..n]) /\
all_different([x[j,i] | j in 1..n])
)
/\
forall(i in 0..2,j in 0..2) (
all_different([x[r,c] | r in i*3+1..i*3+3, c in j*3+1..j*3+3] )
)
/\ % calculate the hints
forall(p in 1..num_p) (
sum(i in 1..num_hints where P[p,2*(i-1)+1] > 0) (x[ P[p, 2*(i-1)+1], P[p,2*(i-1)+2] ]) = P[p, 2*num_hints+1]
)
;
output [
if j = 1 then "\n" else " " endif ++
show(x[i,j])
| i,j in 1..n
];