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*)