Classic Computer Magazine Archive PROGRAM LISTING: 85-09/QUEENS8.ACT


; 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


Back to previous page