// 8 queen

// Q = 8 	size of Q x Q board
// Z = Q+1 = 9	empty
// D = Q+Q-1 = 15  size of diagonal
enum
  8 Q
enum
  9 Z
enum
  15 D

//Q = 8
//Z = 9
//D = 15

to printboard | i j =
  for i 0 Q-1
    for j 0 Q-1
      if j == queen[i] printc 81
      else printc 46
    nl

to find level | i =
  if level == Q
//    printboard nl
    soln = soln + 1
  else
    for i 0 Q-1
      if and (and (col[i] >= level)
      (d45[level+i] >= level))
      (d135[level+Q-1-i] >= level)
          queen[level] = i
          col[i] = level
          d45[level+i] = level
          d135[level+Q-1-i] = level 
          find level+1
          col[i] = Z
          d45[level+i] = Z
          d135[level+Q-1-i] = Z   
 
to main | i =
  soln = 0
  col = array Q
  d45 = array D
  d135 = array D
  queen = array Q
  for i 0 Q-1
    col[i] = Z
  for i 0 D-1
    d45[i] = Z
    d135[i] = Z
  soln = 0
  find 0
  print soln nl
//  for i 0 Q-1
//    print queen[i] space
//  nl

main
