1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | include "globals.mzn" ; int : X; int : Y; int : maxlen; array [1 .. Y,1 .. maxlen] of int : rows; array [1 .. X,1 .. maxlen] of int : cols; array [1 .. 2, 1 .. 2, 1 .. 2] of 0 .. 1: nonmul = array3d (1 .. 2, 1 .. 2, 1 .. 2, [0, 0, 1, 1, 1, 0, 0, 1] ); array [1 .. 2, 1 .. 2, 1 .. 2] of 0 .. 1: nonadd = array3d (1 .. 2, 1 .. 2, 1 .. 2, [0, 0, 0, 1, 1, 0, 0, 1] ); % variables % array [1 .. Y, 1 .. X] of var 1 .. 2: A; % All variables in a region must be different % Ordering to ensure each variable is handled exactly once predicate nonogram_row( array [1 .. Y, 1 .. X] of var 1 .. 2: A, array [ int ] of 0 .. 1: cons, int : row) = nonogram([A[row, v] | v in 1 .. X], cons); predicate nonogram_col( array [1 .. Y, 1 .. X] of var 1 .. 2: A, array [ int ] of 0 .. 1: cons, int : col) = nonogram([A[v,col] | v in 1 .. Y], cons); predicate nonogram( array [ int ] of var 1 .. 2: A, array [ int ] of int : cons) = let { int : n = if cons[1] = 0 then 0 else max ( index_set (cons)) endif , array [1 .. n + 1, 1 .. 2] of int : consarr = if cons[1] = 0 then [|1, 0|] else array2d (1 .. n + 1, 1 .. 2, [1, 2] ++ [ i * nonmul[cons[i - 1] + 1, cons[i] + 1, s] + nonadd[cons[i - 1] + 1, cons[i] + 1, s] | i in 2 .. n, s in 1 .. 2 ] ++ [n + 1,0] ) endif } in ( regular(A, n + 1, 2, consarr, 1, {n + 1}) ); constraint forall(i in 1 .. Y) ( nonogram_row(A, [rows[i, j] | j in 1 .. maxlen where rows[i, j] >= 0], i) ); constraint forall(i in 1 .. X) ( nonogram_col(A, [cols[i, j] | j in 1 .. maxlen where cols[i, j] >= 0], i) ); solve :: int_search( array1d (1 .. X * Y,A),input_order,indomain_max,complete) satisfy ; output [ if fix (A[r, c]) = 1 then " " else "." endif ++ if c = Y then "\n" else " " endif | r in 1 .. X, c in 1 .. Y ]; |