El rompecabezas de n reinas es el problema de colocar n reinas en un tablero de ajedrez de n x n de manera que ninguna de ellas se ataque mutuamente.
Dado un número entero n, devuelva todas las soluciones distintas del rompecabezas de n reinas. Puede devolver la respuesta en cualquier orden. Cada solución contiene una configuración del tablero distinta de la colocación de n reinas, donde "Q" y "." indican una reina y un espacio vacío, respectivamente.
Ejemplo 1:
Entrada: n = 4
Salida: [[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
Explicación: Existen dos soluciones distintas al rompecabezas de las 4 reinas como se muestra arriba
Solución
def solveNQueens(self,n: int)->List[List[str]]: res =[] self.dfs([-1]*n,0,[], res)return res
def dfs(self, numeros, apuntador, construccionActual, res):if apuntador ==len(numeros): res.append(construccionActual)returnfor i inrange(len(numeros)): numeros[apuntador]= i
if self.valid(numeros, apuntador): tmp ="."*len(numeros) self.dfs(numeros, apuntador+1, construccionActual+[tmp[:i]+"Q"+tmp[i+1:]], res)def valid(self, numeros, apuntador):for i inrange(apuntador):ifabs(numeros[i]-numeros[apuntador])== apuntador - i or numeros[i]== numeros[apuntador]:returnFalsereturnTrue
def check_valid_board(board, queens, n):DIRECTIONS=[(1,1),(1,-1),(-1,1),(-1,-1)]for queen inqueens:for direction inDIRECTIONS: i, j = queen
offset_i, offset_j = direction
whileTrue: i += offset_i
j += offset_j
if i <0 or i >= n or j <0 or j >= n:breakif board[i][j]=='Q':returnFalsereturnTruedef append_queen_to_board(i, combinations, taken_columns, queens, n, current_board):iflen(queens)== n: splitted_board = current_board.split("|")ifcheck_valid_board(splitted_board, queens, n): combinations.append(splitted_board)return current_board +='|'for index inrange(n):if index not intaken_columns: current_combination ='.'* index +'Q'+'.'*(n - index -1)append_queen_to_board(i +1, combinations, taken_columns +[index], queens +[(i +1, index)], n, current_board + current_combination)def n_queens(n): combinations =[] taken_columns =[] queens =[]for i inrange(n): current_board ='.'* i +'Q'+'.'*(n - i -1)append_queen_to_board(0, combinations, taken_columns +[i], queens +[(0, i)], n, current_board)return combinations
input_1 =4output_1 =[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]def position_queens(n, current_list, boards):iflen(current_list)== n: base_string ="."* n
board =[]for column_index incurrent_list: board.append(base_string[:column_index]+'Q'+ base_string[column_index+1:]) boards.append(board)returnfor index inrange(n): row =len(current_list) column = index
has_diagonal =Falsefor prev_row, prev_column inenumerate(current_list):ifabs(row - prev_row)==abs(column - prev_column): has_diagonal =Trueif column not in current_list and has_diagonal is False: current_list.append(column)position_queens(n, current_list, boards) current_list.remove(column)def n_queens(n): boards =[]position_queens(n,[],boards)return boards
print(n_queens(input_1))print(n_queens(input_1)== output_1)