queens.a68

     
   1  CO
   2  
   3  @section Synopsis
   4  
   5  'N' queens in classic backtracker.
   6  
   7  CO
   8  
   9  BEGIN
  10  
  11     INT rank = 8;
  12     printf (($"Rank="g(0)l$, rank));
  13     [1 : rank] CCOL column, INT sols found := 0;
  14  
  15     PROC place from  = (CROW this row) VOID:
  16          IF this row > rank
  17          THEN sols found +:= 1;
  18               FOR row TO rank
  19               DO print(("abcdefghijklmnopqrstuvwxyz"[row], whole(column[row], 0), " "))
  20               OD;
  21               print ((sols found MOD 4 = 0 | new line | "  "))
  22          ELSE FOR i TO rank
  23               DO IF BOOL safe := TRUE;
  24                     FOR j TO this row - 1 
  25                     WHILE safe
  26                     DO safe := safe AND NOT (column[j] = i ORF (column[j] - i = this row - j ORF column[j] - i = j - this row))
  27                     OD;
  28                     safe
  29                  THEN column[this row] := i;
  30                       place from (this row + 1)
  31                  FI
  32               OD
  33          FI;
  34               
  35     place from (1);
  36  
  37     MODE CROW = INT, CCOL = INT;
  38  
  39     SKIP
  40  
  41  END