import java.util.
Scanner;
public class NReinas {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
while (true) {
try {
System.out.print("Ingrese el valor de N (máximo 8) para el problema de las N
reinas: ");
n = scanner.nextInt();
if (n > 0 && n <= 8) {
break;
} else {
System.out.println("N debe ser un entero positivo entre 1 y 8.");
} catch (java.util.InputMismatchException e) {
System.out.println("Entrada inválida. Ingrese un número entero.");
scanner.next(); // Limpiar el buffer del scanner
resolverNReinas(n);
/**
* Resuelve el problema de las N reinas y muestra la solución.
* @param n Número de reinas y tamaño del tablero (NxN).
*/
public static void resolverNReinas(int n) {
int[] tablero = new int[n];
if (!colocarReinas(tablero, 0, n)) {
System.out.println("No se encontró ninguna solución.");
/**
* Función recursiva para colocar las reinas en el tablero utilizando backtracking.
* @param tablero Arreglo que representa el tablero de ajedrez.
* @param fila Fila actual en la que se intenta colocar una reina.
* @param n Número total de reinas y tamaño del tablero.
* @return true si se encontró una solución, false en caso contrario.
*/
private static boolean colocarReinas(int[] tablero, int fila, int n) {
if (fila == n) {
mostrarTablero(tablero, n);
return true; // Encontró una solución
for (int columna = 0; columna < n; columna++) {
if (esSeguro(tablero, fila, columna, n)) {
tablero[fila] = columna;
if (colocarReinas(tablero, fila + 1, n)) {
return true; // Propaga la solución hacia arriba
// Backtrack: si no se encuentra solución, se deshace la asignación
return false; // No se encontró solución en esta rama
/**
* Verifica si es seguro colocar una reina en la posición dada.
* @param tablero Arreglo que representa el tablero de ajedrez.
* @param fila Fila en la que se intenta colocar la reina.
* @param columna Columna en la que se intenta colocar la reina.
* @param n Número total de reinas y tamaño del tablero.
* @return true si es seguro colocar la reina, false en caso contrario.
*/
private static boolean esSeguro(int[] tablero, int fila, int columna, int n) {
for (int i = 0; i < fila; i++) {
// Verifica columna y diagonales
if (tablero[i] == columna || Math.abs(tablero[i] - columna) == fila - i) {
return false;
return true;
}
/**
* Muestra el tablero de ajedrez con las reinas colocadas.
* @param tablero Arreglo que representa el tablero de ajedrez.
* @param n Número total de reinas y tamaño del tablero.
*/
private static void mostrarTablero(int[] tablero, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(tablero[i] == j ? "Q " : ". ");
System.out.println();
// Separador
for (int i = 0; i < 2 * n - 1; i++) {
System.out.print("-");
System.out.println();