algol,n<
begin
   comment

      Find a solution for the N queen problem.

      nqueen18.asc

   N    Solutions       Time
   4    2               0.30
   5    10              0.75
   6    4               2.24
   7    40              7.84
   8    92              29.82
   9    352             121.93
   10   724             526.09
   11   2680            2482.02

   No buffer, N=12:

   Time classic:        13968.89
   Time turbo:          12368.89 11.5pct

   Buffer, N=12:

   Time classic:        14069.38
   Time turbo:          12469.37 11.4pct

   ;

   integer N, MAXN, nsolutions;
   boolean empcol;
   boolean empup;
   boolean empdo;
   boolean one,zero;
   integer i;
   real clock;
   real procedure clock count;
   code clock count;
   1, 37;
     zl        , grf p−1   ; RF ≔ clock count; stack[p−1] ≔ RF;
   e;
   procedure set(x);
   value x;
   integer x;
   begin
      integer y;
      boolean mask;
      y ≔ 0;
      mask ≔ empcol ∧ (empdo shift x) ∧ (empup shift (−x));
      for y ≔  y while 0≠integer mask do
      begin
         code mask,y,zero;
         3, 46;
         3, 44;
         2, 46;
         arn pa1,nk re1
         tk 1,mb a3
         gr pa1
         srn re1,ck 10
         ar pa2,ar c42
         gr pa2 V
e1:      qq
         e;
         if x = N then
            nsolutions ≔ nsolutions+1
         else
         begin
            empcol ≔  empcol ∧ (zero shift (−y));
            empup ≔  empup ∧ (zero shift (x−y));
            empdo ≔  empdo ∧ (zero shift (−x−y));
            set(x+1);
            empcol ≔  empcol ∨ (one shift (−y));
            empup ≔  empup ∨ (one shift (x−y));
            empdo ≔  empdo ∨ (one shift (−x−y))
         end
      end
   end set;

   MAXN ≔  12;    comment maximum size;
   one ≔  1 1 39 0;
   zero ≔  1 0 39 m;
   for N ≔ 4 step 1 until MAXN do
   begin
      nsolutions ≔ 0;
      select(17);
      writecr;
      writetext(«looking onto a »);
      writeinteger(«p»,N);
      writetext(« × »);
      writeinteger(«p»,N);
      writetext(« chessboard...»);
      writecr;
      clock count;
      empcol ≔ empup ≔ empdo ≔ false;
      for i ≔  1 step 1 until N do
      empcol ≔  empcol ∨ (one shift −i);
      for i ≔  −N+1 step 1 until N−1 do
      empup ≔  empup ∨ (one shift −i);
      for i ≔  2 step 1 until 2×N do
      empdo ≔  empdo ∨ (one shift −i);

      set(1);

      if nsolutions=0 then
      writetext(«NO SOLUTION.»)
      else
      begin
         clock ≔  clock count;
         writeinteger(«p»,nsolutions);
         writetext(« solutions.»);
         writecr;
         writetext(«Time: »);
         write(«ddddddd.dd»,clock)
      end;
      writecr
   end;
   writetext(«done.»);
   writecr;
   N ≔ N;
end;
t<