begin; comment FIND A SOLUTION FOR THE `N QUEEN' PROBLEM. (GOT THE ALGORITHM FROM A MODULA PROGRAM FROM MARTIN NEITZEL). ; integer N, MAXN; MAXN := 9; comment MAXIMUM SIZE ; N := 2; comment CURRENT SIZE ; TRYNEXTN: begin; integer array COLUMN[1 : N]; Boolean array EMPCOL[1 : N]; Boolean array EMPUP[-N + 1 : N - 1]; Boolean array EMPDO[2 : 2N]; integer I; procedure PRINT; comment PRINT THE CURRENT SOLUTION IN A CHESSBOARD ALIKE PICTURE ; begin; integer I, J; procedure OUTFRAME; begin; integer I; for I := 1 step 1 until N do OUTSTRING(1, `+---'); OUTSTRING(1, `+\N'); end ; OUTSTRING(1, `SEE:\N'); for J := 1 step 1 until N do begin; OUTFRAME; OUTSTRING(1, `|'); for I := 1 step 1 until N do begin; if N + 1 - J = COLUMN[I] then OUTSTRING(1, ` Q |') else OUTSTRING(1, ` |'); end ; OUTSTRING(1, `\N'); end ; OUTFRAME; end ; procedure SET(X); value X; integer X; begin; integer Y; for Y := 1 step 1 until N do begin; if EMPCOL[Y]
EMPUP[X - Y]
EMPDO[X + Y] then begin; COLUMN[Y] := X; EMPCOL[Y] := false; EMPUP[X - Y] := false; EMPDO[X + Y] := false; if X = N then goto GOTONE else SET(X + 1); EMPDO[X + Y] := true; EMPUP[X - Y] := true; EMPCOL[Y] := true; COLUMN[Y] := 0; end ; end ; end ; comment MAIN PROGRAM START ; OUTSTRING(1, `LOOKING ONTO A '); OUTINTEGER(1, N); OUTSTRING(1, ` X '); OUTINTEGER(1, N); OUTSTRING(1, ` CHESSBOARD...\N'); for I := 1 step 1 until N do begin; COLUMN[I] := 0; EMPCOL[I] := true; end ; for I := -N + 1 step 1 until N - 1 do EMPUP[I] := true; for I := 2 step 1 until 2
N do EMPDO[I] := true; SET(1); OUTSTRING(1, `NO SOLUTION.\N'); goto CONTN; GOTONE: PRINT; CONTN: if N < MAXN then begin; N := N + 1; goto TRYNEXTN; end ; OUTSTRING(1, `DONE.\N'); end ; end ;