; 8-QUEENS SOLUTION
; BY DAVE OBLAD
; (c) 1985, ANTIC PUBLISHING
BYTE ARRAY T(96),P(8),I(8),O(8),M(8)
BYTE A,B,C,D,X,Y,L1,L2,L3,OPT=53279
PROC SEARCH()
FOR X=0 TO D
DO
Y=X*8 B=1
FOR A=0 TO 7
DO
IF T(Y+A)#O(A) THEN B=0 FI
OD
IF B=1 THEN RETURN FI
OD
RETURN
PROC ROTATE()
FOR A=0 TO 7
DO
B=7-O(A) M(B)=A
OD
FOR A=0 TO 7
DO
O(A)=M(A)
OD
RETURN
PROC TEST()
FOR A=0 TO 7
DO O(A)=P(A) OD
FOR L1=0 TO 1
DO
FOR L2=0 TO 1
DO
FOR L3=0 TO 3
DO
SEARCH()
IF B=1 THEN RETURN FI
ROTATE()
OD
FOR A=0 TO 7
DO M(A)=O(A) OD
FOR A=0 TO 7
DO O(7-A)=M(A) OD
OD
FOR A=0 TO 7
DO O(A)=7-O(A) OD
OD
B=0
RETURN
PROC KEEP()
X=D*8
FOR A=0 TO 7
DO T(X+A)=P(A) OD
RETURN
PROC DISPLAY()
;REMOVE 5 SEMI-COLONS BELOW
;FOR UNIQUE SOLUTIONS ONLY!
;IF D#0 THEN TEST()
; IF B=1 THEN RETURN
; ELSE KEEP()
; FI
;FI
FOR Y=0 TO 7
DO
FOR X=0 TO 7
DO
POSITION(X+15,Y+8)
IF P(Y)=X THEN PRINT("Q")
ELSE PRINT("+") FI
OD
OD
POSITION(18,18)
D==+1 PRINTB(D)
RETURN
PROC TRY()
FOR Y=0 TO 6
DO
FOR X=Y+1 TO 7
DO
A=P(X)-P(Y) B=X-Y
IF A>7 THEN A=255-A+1 FI
IF A=B THEN RETURN FI
OD
OD
DISPLAY()
RETURN
PROC SWAP()
C=0 I(C)==+1
WHILE I(C)=C+2
DO
I(C)=0 C==+1 I(C)==+1
IF C<7 THEN
FOR B=0 TO C
DO
A=P(B) P(B)=P(B+1) P(B+1)=A
OD
FI
OD
A=P(0) P(0)=P(1) P(1)=A
RETURN
PROC MAIN()
BYTE CONSOLE=53279
DO
GRAPHICS(0) POKE(752,1)
POSITION(8,0)
PRINTE(" 8-QUEENS SOLUTIONS")
PRINTE(" BY DAVE OBLAD")
FOR A=0 TO 7 DO P(A)=A I(A)=0 OD
FOR A=0 TO 96 DO T(A)=0 OD
D=0
DO
TRY() SWAP()
FOR A=0 TO 7
DO
IF A#P(A) THEN EXIT FI
OD
IF A=8 OR OPT#7 THEN EXIT FI
OD
IF A=8 THEN POSITION(15,20)
PRINTE("COMPLETE")
PUTE()
PRINTE("PRESS ÓÔÁÒÔ TO RE-RUN")
FI
DO
UNTIL CONSOLE < 7
OD
OD
RETURN