=begin
N-Queen Problem
=end
def place_queen(queen_count)
place(0, queen_count, [])
end
def place(row, queen_count, columns)
if row == queen_count
print_queen_place(queen_count, columns)
return
end
movable_cols = get_movable_places(row, queen_count, columns)
movable_cols.each do |col|
columns[row] = col
place(row + 1, queen_count, columns)
end
end
def get_movable_places(row, queen_count, columns)
places = []
(0...queen_count).each { |i| places[i] = 1 }
(0...row).each do |rowidx|
prev_place = columns[rowidx]
places[prev_place] = 0
oppo_angle_left = prev_place - (row - rowidx).abs
oppo_angle_right = prev_place + (row - rowidx).abs
places[oppo_angle_left] = 0 if oppo_angle_left >= 0
places[oppo_angle_right] = 0 if oppo_angle_right < queen_count
end
movable_cols = []
places.each_index { |i| movable_cols.push i if 1 == places[i] }
movable_cols
end
def print_queen_place(queen_count, columns)
puts "Queen -------------------------------------"
(0...queen_count).each do |i|
(0...queen_count).each do |j|
if j == columns[i]
print 'Q'
else
print '.'
end
end
puts
end
end
place_queen(4)