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