RosettaCodeData/Task/N-queens-problem/Ruby/n-queens-problem-2.rb

40 lines
841 B
Ruby

class Queen
attr_reader :count
def initialize(num=8, out=true)
@num = num
@out = out
@row = *0...@num
@frame = "+-" + "--" * @num + "+"
@count = 0
add = Array.new(2 * @num - 1, true) # \ direction check
sub = Array.new(2 * @num - 1, true) # / direction check
solve([], add, sub)
end
private
def solve(row, add, sub)
y = row.size
if y == @num
print_out(row) if @out
@count += 1
else
(@row-row).each do |x|
next unless add[x+y] and sub[x-y]
add[x+y] = sub[x-y] = false
solve(row+[x], add, sub)
add[x+y] = sub[x-y] = true
end
end
end
def print_out(row)
puts @frame
row.each do |i|
line = @num.times.map {|j| j==i ? "Q " : ". "}.join
puts "| #{line}|"
end
puts @frame
end
end