The following program finds 4 solutions, but they consist of two significant solutions plus the trivial swapping of pieces F and H, which are identical except for their presented rotation. One significant solution has A in the center, and the other has G. The center piece is always assumed to be in the same orientation as originally presented in the puzzle; any rotation of it would just produce trivial rotations of the whole solutions.
DATA 1,4,-2,-3, 2,-1,-4,3, 1,-2,-4,3
DATA -1,-4,1,2, -2,1,3,-4, 2,-3,-4,1
DATA 3,4,-1,-2, -3,-4,1,2, 3,4,-3,-2
DIM SHARED pc(9, 4), used(9), board(9, 9)
CLS
FOR i = 1 TO 9
FOR j = 1 TO 4
READ pc(i, j)
NEXT
NEXT
FOR ctr = 1 TO 9
used(ctr) = 1
board(4, 5) = pc(ctr, 1)
board(5, 6) = pc(ctr, 2)
board(6, 5) = pc(ctr, 3)
board(5, 4) = pc(ctr, 4)
board(5, 5) = ctr
FOR t = 1 TO 9
IF used(t) = 0 THEN
used(t) = 1
good = 0
FOR i = 1 TO 4
IF pc(t, i) = -board(4, 5) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(3, 5) = pc(t, i): i = i + 1: IF i > 4 THEN i = i - 4
board(2, 4) = pc(t, i): i = i + 1: IF i > 4 THEN i = i - 4
board(1, 5) = pc(t, i): i = i + 1: IF i > 4 THEN i = i - 4
board(2, 6) = pc(t, i)
board(2, 5) = t
FOR tr = 1 TO 9
IF used(tr) = 0 THEN
used(tr) = 1
good = 0
FOR i = 1 TO 4
IF pc(tr, i) = -board(2, 6) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(2, 7) = pc(tr, i): i = i + 1: IF i > 4 THEN i = i - 4
board(1, 8) = pc(tr, i): i = i + 1: IF i > 4 THEN i = i - 4
board(2, 9) = pc(tr, i): i = i + 1: IF i > 4 THEN i = i - 4
board(3, 8) = pc(tr, i)
board(2, 8) = tr
FOR r = 1 TO 9
IF used(r) = 0 THEN
used(r) = 1
good = 0
FOR i = 1 TO 4
IF pc(r, i) = -board(3, 8) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(4, 8) = pc(r, i): i = i + 1: IF i > 4 THEN i = i - 4
board(5, 9) = pc(r, i): i = i + 1: IF i > 4 THEN i = i - 4
board(6, 8) = pc(r, i): i = i + 1: IF i > 4 THEN i = i - 4
IF pc(r, i) <> -board(5, 6) THEN good = 0
board(5, 7) = pc(r, i)
board(5, 8) = r
IF good THEN
FOR br = 1 TO 9
IF used(br) = 0 THEN
used(br) = 1
good = 0
FOR i = 1 TO 4
IF pc(br, i) = -board(6, 8) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(7, 8) = pc(br, i): i = i + 1: IF i > 4 THEN i = i - 4
board(8, 9) = pc(br, i): i = i + 1: IF i > 4 THEN i = i - 4
board(9, 8) = pc(br, i): i = i + 1: IF i > 4 THEN i = i - 4
board(8, 7) = pc(br, i)
board(8, 8) = br
IF good THEN
FOR b = 1 TO 9
IF used(b) = 0 THEN
used(b) = 1
good = 0
FOR i = 1 TO 4
IF pc(b, i) = -board(8, 7) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(8, 6) = pc(b, i): i = i + 1: IF i > 4 THEN i = i - 4
board(9, 5) = pc(b, i): i = i + 1: IF i > 4 THEN i = i - 4
board(8, 4) = pc(b, i): i = i + 1: IF i > 4 THEN i = i - 4
board(7, 5) = pc(b, i)
board(8, 5) = b
IF pc(b, i) <> -board(6, 5) THEN good = 0
IF good THEN
FOR bl = 1 TO 9
IF used(bl) = 0 THEN
used(bl) = 1
good = 0
FOR i = 1 TO 4
IF pc(bl, i) = -board(8, 4) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(8, 3) = pc(bl, i): i = i + 1: IF i > 4 THEN i = i - 4
board(9, 2) = pc(bl, i): i = i + 1: IF i > 4 THEN i = i - 4
board(8, 1) = pc(bl, i): i = i + 1: IF i > 4 THEN i = i - 4
board(7, 2) = pc(bl, i)
board(8, 2) = bl
IF good THEN
FOR l = 1 TO 9
IF used(l) = 0 THEN
used(l) = 1
good = 0
FOR i = 1 TO 4
IF pc(l, i) = -board(7, 2) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(6, 2) = pc(l, i): i = i + 1: IF i > 4 THEN i = i - 4
board(5, 1) = pc(l, i): i = i + 1: IF i > 4 THEN i = i - 4
board(4, 2) = pc(l, i): i = i + 1: IF i > 4 THEN i = i - 4
board(5, 3) = pc(l, i)
board(5, 2) = l
IF pc(l, i) <> -board(5, 4) THEN good = 0
IF good THEN
FOR tl = 1 TO 9
IF used(tl) = 0 THEN
used(tl) = 1
good = 0
FOR i = 1 TO 4
IF pc(tl, i) = -board(4, 2) THEN
good = 1: EXIT FOR
END IF
NEXT i
IF good THEN
board(3, 2) = pc(tl, i): i = i + 1: IF i > 4 THEN i = i - 4
board(2, 1) = pc(tl, i): i = i + 1: IF i > 4 THEN i = i - 4
board(1, 2) = pc(tl, i): i = i + 1: IF i > 4 THEN i = i - 4
board(2, 3) = pc(tl, i)
board(2, 2) = tl
IF pc(tl, i) <> -board(2, 4) THEN good = 0
IF good THEN
FOR row = 1 TO 9
FOR col = 1 TO 9
IF (row = 1 OR row = 3 OR row = 4 OR row = 6 OR row = 7 OR row = 9) THEN
IF col = 2 OR col = 5 OR col = 8 THEN
PRINT USING "## "; board(row, col);
ELSE
PRINT " ";
END IF
ELSE
IF col MOD 3 = 2 THEN
PRINT "("; MID$("ABCDEFGHI", board(row, col), 1); ")";
ELSE
PRINT USING "## "; board(row, col);
END IF
END IF
NEXT col
PRINT
NEXT row
PRINT
END IF
END IF
used(tl) = 0
END IF
NEXT tl
END IF
END IF
used(l) = 0
END IF
NEXT l
END IF
END IF
used(bl) = 0
END IF
NEXT bl
END IF
END IF
used(b) = 0
END IF
NEXT b
END IF
END IF
used(br) = 0
END IF
NEXT br
END IF
END IF
used(r) = 0
END IF
NEXT r
END IF
used(tr) = 0
END IF
NEXT tr
END IF
used(t) = 0
END IF
NEXT t
used(ctr) = 0
NEXT ctr
The solutions are listed as:
1 3 1
-4 (D) 2 -2 (G) 4 -4 (F) 2
-1 -1 -3
1 1 3
-2 (E) 3 -3 (A) 4 -4 (C) 1
-4 -2 -2
4 2 2
3 (I)-3 3 (B)-1 1 (H)-3
-2 -4 -4
1 3 1
-4 (D) 2 -2 (G) 4 -4 (H) 2
-1 -1 -3
1 1 3
-2 (E) 3 -3 (A) 4 -4 (C) 1
-4 -2 -2
4 2 2
3 (I)-3 3 (B)-1 1 (F)-3
-2 -4 -4
1 3 1
-4 (H) 2 -2 (I) 4 -4 (D) 2
-3 -3 -1
3 3 1
-4 (B) 2 -2 (G) 4 -4 (F) 2
-1 -1 -3
1 1 3
-2 (E) 3 -3 (A) 4 -4 (C) 1
-4 -2 -2
1 3 1
-4 (F) 2 -2 (I) 4 -4 (D) 2
-3 -3 -1
3 3 1
-4 (B) 2 -2 (G) 4 -4 (H) 2
-1 -1 -3
1 1 3
-2 (E) 3 -3 (A) 4 -4 (C) 1
-4 -2 -2
|
Posted by Charlie
on 2005-12-11 19:25:20 |