Я работаю над программой Куинса N, которая позволит пользователю вводить конфигурацию Королевы как Строку. Например, при запросе пользователь мог бы ввести что-то как Q.... Q..... Q.. Q., на который при отображении как будет похожа плата:
Q . . .
. Q . .
. . . Q
. . Q .
Is not a solution!
Эта программа проста в этом, она предполагает, что пользователь введет допустимую информацию. Я хотел бы получить основную часть программы, работающей, прежде чем я возвращусь и добавлю обработку ошибок.
Для не знакомых с загадкой Куинса N, в основном у Вас есть Куинс N на N x N плата. У Вас есть одна Королева на строку. Смонтированная плата является решением если никакие две доли Куинса та же строка, столбец или диагональ.
Я успешно реализовал проверки на строки и столбцы. Однако я озадачен относительно того, как я могу проверить все диагонали. Я знаю, как проверить две основных диагонали, как в тике tac палец ноги, но я действительно не могу визуализировать, как я могу проверить все возможные диагонали?
Кто-либо может предложить справку?
Вот мой код:
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
Спасибо Читать дальше Нуждается в помощи С Программой Куинса N
Я не думаю, что вы хотите проверять все диагонали, но вместо этого вы можете проверить все ферзя. Вы можете проверить, находятся ли две ферзя на одной диагонали, проверив различия между строками и столбцами двух Q. Если различия одинаковы, они находятся на одной диагонали. (Обычно, если наклон линии между двумя ферзями равен + -1, они находятся на одной диагонали.)
Например, скажем, у вас есть два ферзя Q1 и Q2. Вычислите абсолютное значение разницы в их строках и столбцах.
deltaRow = abs(Q1 row - Q2 row)
deltaCol = abs(Q1 col - Q2 col)
Если deltaRow == deltaCol
, ферзи находятся на одной диагонали.
Сделайте это для всех N ферзей.
Диагонали могут быть выражены в виде y = x + c или y = c - x. Ваша плата 4x4 будет иметь в общей сложности 10 диагоналей, по 5 для каждого уравнения. Выясните c (они варьируются в зависимости от размера платы) и зацикливайте на x, вычислите y.
Вам придется проверить координаты меньше нуля, верхних границ можно избежать, просто сделав доску в 2 раза больше (в каждом направлении), как это необходимо - другие квадраты всегда пусты, поэтому их проверка не причиняет вреда.
Я даже реализовал проблему N queens без доски вообще - отслеживайте ряды, столбцы и диагонали. В то время это было быстрее, потому что сложение было намного быстрее, чем умножение, но это уже не так.