Just for another data point, here's a version that I wrote ages ago
that attempts to be as Ruby-ish as possible. The board is stored in
such a way that a single line of Ruby can test if a new queen can be
placed in a given square, and solutions are yielded to a block as
they're found. (Put a 'break' into the block if you only want the
first solution.)
Pete Yandell
http://9cays.com
module Queens
Queen = Struct.new(:x, :y)
class Board < Array
def to_s
map {|q| "."*q.x + "X" + "."*(size-q.x-1)}.join("\n") + "\n"
end
def add(*q)
Board.new(self + q)
end
end
def self.solve(size = 8, queens = Board.new, &block)
if queens.size == size
yield queens
else
y = queens.size
for x in 0...size
unless queens.any? {|q| x == q.x or (x-q.x).abs == (y-
q.y).abs }
solve(size, queens.add(Queen.new(x,y)), &block)
end
end
end
end
end
Queens::solve {|q| print q.to_s, "\n" }