git-subtree-dir: software/mza git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
50 lines
1.1 KiB
MiniZinc
50 lines
1.1 KiB
MiniZinc
% RUNS ON mzn20_fd
|
|
% RUNS ON mzn-fzn_fd
|
|
% RUNS ON mzn20_fd_linear
|
|
% RUNS ON mzn20_mip
|
|
% n-queens example in Zinc using IP techniques
|
|
% By Ralph Becket
|
|
|
|
% MiniZinc version
|
|
% Peter Stuckey September 30 2006
|
|
|
|
int: n = 8;
|
|
|
|
set of int: rg = 0 .. n-1;
|
|
|
|
array [rg, rg] of var 0 .. 1: q;
|
|
|
|
%
|
|
% Every row and column has exactly one queen.
|
|
% Every diagonal has at most one queen.
|
|
%
|
|
|
|
constraint forall (i in rg) (
|
|
( sum (j in rg) (q[i, j]) = 1 )
|
|
/\ ( sum (j in rg) (q[j, i]) = 1 )
|
|
/\ ( sum (j, k in rg where j - k = i) (q[j, k]) <= 1 )
|
|
/\ ( sum (j, k in rg where j - k = - i) (q[j, k]) <= 1 )
|
|
/\ ( sum (j, k in rg where j - k = i) (q[n - 1 - j, k]) <= 1 )
|
|
/\ ( sum (j, k in rg where j - k = - i) (q[n - 1 - j, k]) <= 1 )
|
|
);
|
|
|
|
%
|
|
% Find the first solution.
|
|
%
|
|
|
|
solve ::
|
|
int_search(
|
|
array1d(1..n*n, q),
|
|
first_fail,
|
|
indomain_min,
|
|
complete
|
|
)
|
|
satisfy;
|
|
|
|
output ["8 queens, IP version:"] ++
|
|
[ if j = 0 then "\n" else "" endif ++
|
|
if fix(q[i, j]) = 1 then "Q " else ". " endif
|
|
| i, j in rg
|
|
] ++
|
|
[ "\n" ];
|