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;
TRY NEXT N:
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 TRY NEXT N
end;
OUTSTRING (1, “DONE.\N”)
end
end