begin comment -- From the NASE A60 distribution -- 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 prints (`+---'); printsln (`+') end; for j := 1 step 1 until N do begin outframe; prints (`|'); for i := 1 step 1 until N do begin if N + 1 - j = column [i] then prints (` Q |') else prints (` |') end; printsln (`') 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 ; prints (`looking onto a '); printn (N); prints (` x '); printn (N); printsln (` chessboard...'); 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 ) ; printsln (`NO SOLUTION.'); goto contN; gotone: printsln(`SOLVED'); print; contN: if N < MAXN then begin N := N + 1; goto tryNextN end; printsln (`done.') end end