class Queens
 def initialize(nqueens = 8)
  @col = []
  @qpos = []
  @up = []
  @down = []
  @nqueens = nqueens
  (0...@nqueens).each { |i|
   @col[i] = @qpos[i] = 0
  }
  (-@nqueens...@nqueens).each { |i|
   @up[i+@nqueens] = 0
   @down[i+@nqueens] = 0
  }
 end

 def out(block)
  if block then
   block.call(@qpos)
  else
   puts((0...@nqueens).collect { |i| @qpos[i].to_s }.join(" "))
  end
 end
 
 def expand(n,block)
  (0...@nqueens).each { |c|
   if @col[c] == 0 && @up[n+c] == 0 &&
     @down[n-c+@nqueens] == 0 then
    @qpos[n] = c
    if n+1 >= @nqueens then
     out(block)
    else
     @col[c] = @up[n+c] = @down[n-c+@nqueens] = 1
     expand(n+1,block)
     @col[c] = @up[n+c] = @down[n-c+@nqueens] = 0
    end
   end
  }
 end
 
 def run(&block)
  while true do
   expand(0,block)
  end
 end
end

if __FILE__ == $0 then
 Queens.new.run
end