class Queen def initialize( column, neighbor ) @row = 1 @col = column @neighbor = neighbor end def find_solution while ( @neighbor && @neighbor.can_attack(@row, @col) ) unless self.advance return false end end return true end def advance if ( @row < 8 ) @row += 1 return self.find_solution end if @neighbor unless @neighbor.advance return false end unless @neighbor.find_solution return false end else return false end @row = 1 return self.find_solution end def can_attack( row, col ) col_diff = col - @col row_candidates = [ @row, @row + col_diff, @row - col_diff ] if row_candidates.include?( row ) return true end if @neighbor return @neighbor.can_attack( row, col ) end return false end def to_s str = "" if @neighbor str = @neighbor.to_s end str + "column #@col #@row\n" end end def go last_queen = nil (1..8).each do |column| last_queen = Queen.new( column, last_queen ) last_queen.find_solution # puts last_queen end puts last_queen end go