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 : 2
N];
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 ;