MODULE NQueens; FROM InOut IMPORT Write, WriteCard, WriteString, WriteLn; CONST N = 8; VAR hist: ARRAY [0..N-1] OF CARDINAL; count: CARDINAL; PROCEDURE Solve(n, col: CARDINAL); VAR i, j: CARDINAL; PROCEDURE Attack(i, j: CARDINAL): BOOLEAN; VAR diff: CARDINAL; BEGIN IF hist[j] = i THEN RETURN TRUE; ELSE IF hist[j] < i THEN diff := i - hist[j]; ELSE diff := hist[j] - i; END; RETURN diff = col-j; END; END Attack; BEGIN IF col = n THEN INC(count); WriteLn; WriteString("No. "); WriteCard(count, 0); WriteLn; WriteString("---------------"); WriteLn; FOR i := 0 TO n-1 DO FOR j := 0 TO n-1 DO IF j = hist[i] THEN Write('Q'); ELSIF (i + j) MOD 2 = 1 THEN Write(' '); ELSE Write('.'); END; END; WriteLn; END; ELSE FOR i := 0 TO n-1 DO j := 0; WHILE (j < col) AND (NOT Attack(i,j)) DO INC(j); END; IF j >= col THEN hist[col] := i; Solve(n, col+1); END; END; END; END Solve; BEGIN count := 0; Solve(N, 0); END NQueens.