PROGRAM EIGHTQUEENS(INPUT, OUTPUT) ;
VAR I, SCNT : INTEGER ;
    SAFE : BOOLEAN ;
    A : ARRAY[1..8] OF BOOLEAN ;
    B : ARRAY[2..16] OF BOOLEAN ;
    C : ARRAY[-7..7] OF BOOLEAN ;
    X : ARRAY[1..8] OF INTEGER ;
    
PROCEDURE PRINT ;
VAR K, L, M, N : INTEGER ;
BEGIN SCNT := SCNT+1 ;
WRITELN(' ') ; WRITELN('SOLUTION NO:':20, SCNT:3) ;
WRITELN(' ') ; WRITELN(' ') ;
FOR K := 1 TO 8 DO
         BEGIN  WRITE(' ':12) ;
         FOR L := 1 TO 8 DO
               BEGIN  IF ODD(K+L) THEN  N :=  128  ELSE N := 0 ;
               IF X[K] = L THEN  M := N+28  ELSE M := N ;
               WRITE( CHR(M) ) ;
               IF X[K] = L THEN  M := N+3   ELSE  M := N ;
               WRITE( CHR(M) ) ;
               IF X[K] = L THEN  M := N+30  ELSE  M := N ;
               WRITE( CHR(M) ) ;
               END ;
         WRITELN ;
         END ;
    
FOR L := 1 TO 3 DO WRITELN(' ') ;
WRITELN('   ENTER ''Q'' TO', ' QUIT, ''C'' TO CONTINUE ') ;
GET(INPUT) ;
WHILE INPUT@ = ' ' DO GET(INPUT) ;
IF INPUT@ ='Q' THEN SCNT := 92 ;
END ;
    
PROCEDURE TRYCOL(J : INTEGER ) ;
         VAR I : INTEGER ;
    
         PROCEDURE SETQUEEN ;
         BEGIN A[I]:=FALSE ; B[I+J]:=FALSE ; C[I-J]:=FALSE
         END ;
    
         PROCEDURE REMOVEQUEEN ;
         BEGIN A[I]:=TRUE ; B[I+J]:=TRUE ; C[I-J]:=TRUE
         END ;
    
   BEGIN
        I:=0 ;
        REPEAT I:=I+1 ; SAFE:=A[I] AND B[I+J] AND C[I-J] ;
             IF SAFE THEN
             BEGIN SETQUEEN ; X[J]:=I ;
                  IF J<8 THEN TRYCOL(J+1) ELSE PRINT ;
                  REMOVEQUEEN
             END
        UNTIL (I = 8) OR (SCNT >= 92) ;
   END ;
    
BEGIN (*MAINBLOCK*)
    
WRITELN('  EIGHT QUEENS PROBLEM ') ;  WRITELN( ) ;
FOR I:=1 TO 8 DO A[I]:=TRUE ;
FOR I:=2 TO 16 DO B[I]:=TRUE ;
FOR I:=-7  TO 7 DO C[I]:=TRUE ;
(* INTFIELDSIZE := 2;  *)  SCNT := 0 ;
TRYCOL (1);
(* INTFIELDSIZE := 12; *)
WRITELN('  * DONE *') ;
END.  (*EIGHT QUEENS*)

