


from __future__ import annotations




def        snake_case_					(  snake_case      ,							snake_case      ,							snake_case      ,							snake_case      ,							snake_case      ,							)  ->    Optional[Any]:
       lowercase__:       int        =       len(__lowerCamelCase					)

       # If row is equal to the size of the board it means there are a queen in each row in
       # the current board (possible_board)
       if row == n:
              # We convert the variable possible_board that looks like this: [1, 3, 0, 2] to
              # this: ['. Q . . ', '. . . Q ', 'Q . . . ', '. . Q . ']
              boards.append(['. ' * i + 'Q ' + '. ' * (n - 1 - i) for i in possible_board]					)
              return

       # We iterate each column in the row to find all possible results in each row
       for col in range(__lowerCamelCase					):
              # We apply that we learned previously. First we check that in the current board
              # (possible_board) there are not other same value because if there is it means
              # that there are a collision in vertical. Then we apply the two formulas we
              # learned before:
              #
              # 45º: y - x = b or 45: row - col = b
              # 135º: y + x = b or row + col = b.
              #
              # And we verify if the results of this two formulas not exist in their variables
              # respectively.  (diagonal_right_collisions, diagonal_left_collisions)
              #
              # If any or these are True it means there is a collision so we continue to the
              # next value in the for loop.
              if (
                  col in possible_board
                  or row - col in diagonal_right_collisions
                  or row + col in diagonal_left_collisions
              ):
                     continue

              # If it is False we call dfs function again and we update the inputs
              depth_first_search(
                  [*possible_board, col]      ,							[*diagonal_right_collisions, row - col]      ,							[*diagonal_left_collisions, row + col]      ,							__lowerCamelCase      ,							__lowerCamelCase      ,							)




def        snake_case_					(  snake_case					)  ->    Optional[int]:
       lowercase__:       list[list[str]]        =       []
       depth_first_search([]      ,							[]      ,							[]      ,							__lowerCamelCase      ,							__lowerCamelCase					)

       # Print all the boards
       for board in boards:
              for column in board:
                     print(__lowerCamelCase					)
              print(''					)

       print(len(__lowerCamelCase					)      ,							'solutions were found.'					)


if __name__ == "__main__":
 import doctest

 doctest.testmod()
 n_queens_solution(4)



from math import pow




def        snake_case_					(  snake_case      ,							snake_case      ,							snake_case      ,							snake_case      ,							snake_case      ,							)  ->    tuple[int, int]:
       if current_sum == needed_sum:
              # If the sum of the powers is equal to needed_sum, then we have a solution.
              solutions_count += 1
              return current_sum, solutions_count

       lowercase__:       int        =       int(pow(snake_case      ,							snake_case					)					)
       if current_sum + i_to_n <= needed_sum:
              # If the sum of the powers is less than needed_sum, then continue adding powers.
              current_sum += i_to_n
              lowercase__      ,						lowercase__:       Any        =       backtrack(
                  snake_case      ,							snake_case      ,							current_number + 1      ,							snake_case      ,							snake_case					)
              current_sum -= i_to_n
       if i_to_n < needed_sum:
              # If the power of i is less than needed_sum, then try with the next power.
              lowercase__      ,						lowercase__:       Optional[int]        =       backtrack(
                  snake_case      ,							snake_case      ,							current_number + 1      ,							snake_case      ,							snake_case					)
       return current_sum, solutions_count




def        snake_case_					(  snake_case      ,							snake_case					)  ->    int:
       if not (1 <= needed_sum <= 10_00 and 2 <= power <= 10):
              raise ValueError(
                  'Invalid input\n'
                  'needed_sum must be between 1 and 1000, power between 2 and 10.'					)

       return backtrack(snake_case      ,							snake_case      ,							1      ,							0      ,							0					)[1]  # Return the solutions_count


if __name__ == "__main__":
 import doctest

 doctest.testmod()


