Estoy trabajando en un programa N Queens que permitirá al usuario ingresar una configuración Queen como una cadena. Por ejemplo, cuando se le solicite, el usuario puede ingresar algo como Q .... Q ..... Q..Q. que cuando se muestra como una tabla se vería así:Necesito ayuda con el programa N Queens (control de diagonales)
Q . . .
. Q . .
. . . Q
. . Q .
Is not a solution!
Este programa es simple, ya que se supone que el usuario introducirá información válida. Me gustaría que la parte principal del programa funcione antes de volver y agregar el manejo de errores.
Para aquellos que no estén familiarizados con el rompecabezas N Queens, básicamente tiene N Queens en una placa N x N. Tienes una Reina por fila. Una placa poblada es una solución si no hay dos reinas que compartan la misma fila, columna o diagonal.
Implementé con éxito las comprobaciones de las filas y columnas. Sin embargo, estoy perplejo en cuanto a cómo puedo verificar todas las diagonales. Sé cómo revisar las dos diagonales principales, como en tic tac toe, pero realmente no puedo visualizar cómo puedo verificar todas las posibles diagonales.
¿Alguien puede ofrecer ayuda?
Aquí está mi código:
import java.util.Scanner;
public class NQueens {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int qCount;
boolean solution = true;
System.out.println("Enter the String to test:");
board = sc.nextLine();
int boardLen = board.length();
int maxDim = (int) Math.sqrt(boardLen);
char[][] gameBoard = new char[maxDim][maxDim];
int counter = 0;
for (int i = 0; i < maxDim; i++)
{
for (int j = 0; j < maxDim; j++)
{
gameBoard[ i ][ j ] = board.charAt(counter);
counter++;
}
}
System.out.println("");
System.out.println("");
//check rows
for (int i = 0; i < maxDim; i++)
{
int queenCount = 0;
for (int j = 0; j < maxDim; j++)
{
if (gameBoard[ i ][ j ] == 'Q')
{
queenCount++;
if (queenCount > 1)
{
solution = false;
break;
}
}
}
}
// check columns
for (int i = 0; i < maxDim; i++)
{
int queenCount = 0;
for (int j = 0; j < maxDim; j++)
{
if (gameBoard[ j ][ i ] == 'Q')
{
queenCount++;
if (queenCount > 1)
{
solution = false;
break;
}
}
}
}
// print the board
for(int i = 0; i < maxDim; i++)
{
for (int j = 0; j < maxDim; j++)
{
System.out.print(gameBoard[ i ][ j ] + " ");
}
System.out.println();
}
// print whether or not the placement of queens is a solution
if (solution)
{
System.out.println("Is a solution!");
}
else
{
System.out.println("Is not a solution!");
}
}//end main
}//end class
Gracias Leer más: necesito ayuda con Programa de Queens N
Así que, básicamente, lo que dices es que puedo almacenar el valor xey de cada reina en otra matriz de 2d y luego realizar la verificación que ilustraste? – Codebug
@Will: Sí, solo almacena la xey de cada reina y haz el control de cada par. –
¿No necesita un valor absoluto aquí? – shinzou