this repo has no description
at develop 1.6 kB view raw
1% Altura del tablero. 2int: h; set of int: H = 1..h; 3 4% Ancho del tablero. 5int: w; set of int: W = 1..w; 6 7% Tablero. 8array[H,W] of -1..5: b; 9 10% Tablero vacio. 11int: E = -1; 12 13% Tablero lleno y numerado. 14set of int: N = 0..4; 15 16% Tablero lleno y no numerado. 17int: F = 5; 18 19% Posición (i1, j1) es visible para (i2, j2). 20test visible(int: i1, int: j1, int: i2, int: j2) = 21 ((i1 == i2) /\ forall(j in min(j1,j2)..max(j1,j2))(b[i1,j] == E)) 22 \/ ((j1 == j2) /\ forall(i in min(i1,i2)..max(i1,i2))(b[i,j1] == E)); 23 24% Hay una luz. 25array[H,W] of var bool: l; 26 27% Tableros llenos que no tienen luces. 28constraint forall(i in H, j in W where b[i,j] != E)(l[i,j] == false); 29 30% Las luces del tablero numerado esta correcto. 31 32constraint forall(i in H, j in W where b[i,j] in N)( 33 bool_sum_eq([ l[i1,j1] | i1 in i-1..i+1, j1 in j-1..j+1 where 34 abs(i1 - i) + abs(j1 - j) == 1 /\ 35 i1 in H /\ j1 in W ], b[i,j])); 36 37% Cada tablero en blanco está iluminado. 38constraint forall(i in H, j in W where b[i,j] == E)( 39 exists(j1 in W where visible(i,j,i,j1))(l[i,j1]) \/ 40 exists(i1 in H where visible(i,j,i1,j))(l[i1,j]) 41 ); 42 43% No hay dos luces que se vean. 44constraint forall(i1,i2 in H, j1,j2 in W where 45 (i1 != i2 \/ j1 != j2) /\ b[i1,j1] == E 46 /\ b[i2,j2] == E /\ visible(i1,j1,i2,j2))( 47 not l[i1,j1] \/ not l[i2,j2] 48 ); 49 50solve satisfy; 51output [ if b[i,j] != E then show(b[i,j]) 52 else if fix(l[i,j]) then "L" else "." endif 53 endif ++ if j == w then "\n" else " " endif | 54 i in H, j in W];