我正在开发一个N Queens程序,允许用户输入Queen配置作为String。例如, 当提示时,用户可能输入Q ...... Q ..... Q..Q。当显示为电路板时,它看起来像:
Q . . .
. Q . .
. . . Q
. . Q .
Is not a solution!
该程序很简单,因为它假定用户将输入有效信息。在我回去并添加错误处理之前,我想让程序的主要部分工作。
对于那些不熟悉N Queens拼图的人,基本上你在N x N板上有N Queens。你每行有一个女王。如果没有两个皇后区共享相同的行,列或对角线,则填充板是一种解决方案。
我已经成功实现了对行和列的检查。但是,我很难过如何检查所有的对角线。我知道如何检查两个主要的对角线,比如在tic tac toe,但我真的无法想象我如何检查所有可能的对角线?
有人可以提供帮助吗?
这是我的代码:
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皇后计划
答案 0 :(得分:21)
我认为您不想检查所有对角线,但您可以检查所有的女王。您可以通过检查两个Q的行和列之间的差异来检查两个皇后是否在同一对角线上。如果差异相同,则它们在相同的对角线上。 (基本上,如果两个皇后之间的线的斜率为+ -1,则它们位于同一对角线上。)
例如,假设你有两个皇后Q1和Q2。计算行和列中差异的绝对值。
deltaRow = abs(Q1 row - Q2 row)
deltaCol = abs(Q1 col - Q2 col)
如果deltaRow == deltaCol
,则皇后位于同一对角线上。
为所有N皇后做这件事。
答案 1 :(得分:2)
如果连接2个皇后的线的斜率为1或-1,我们可以说皇后位于同一对角线上。
让android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
和q1
成为保存每位女王的x和y位置的数据结构:
q2
所以xDistance = q1.x - q2.x
yDistance = q1.y - q2.y
slope = xDistance / yDistance
然后它们在同一对角线上。
答案 2 :(得分:1)
对角线可以以y = x + c或y = c-x的形式表示。你的4x4电路板总共有10个对角线,每个等式5个。找出c(它们根据电路板大小而变化)并在x上循环,计算y。
您必须检查小于零的坐标,可以通过简单地使板2x在需要时使其大(在每个方向上)来避免上限 - 其他方块始终为空,因此检查它们会导致否危害。
我甚至实现了N皇后问题,根本没有电路板 - 跟踪行,列和对角线。当时这个速度更快,因为加法比乘法快得多,但现在不再是这样了。