40 lines
841 B
Ruby
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
|