我正在研究一个N皇后计划,允许用户输入皇后配置作为一个字符串。例如, 出现提示时,用户可能会输入类似Q .... Q ..... Q..Q。当显示为电路板时,它看起来像:N皇后计划需要帮助(检查对角线)
Q . . .
. Q . .
. . . Q
. . Q .
Is not a solution!
该程序很简单,它假定用户将输入有效信息。我想在返回并添加错误处理之前让程序的主要部分工作。
对于那些不熟悉N皇后拼图的人,基本上你在N×N棋盘上有N张皇后。你每行有一个女王。如果没有两个皇后共享相同的行,列或对角线,则填充板是解决方案。
我已成功实施对行和列的检查。然而,我很难理解我如何检查所有的对角线。我知道如何检查两个主对角线,就像在井字游戏中一样,但我真的无法想象我如何检查所有可能的对角线?
任何人都可以提供帮助吗?
这里是我的代码:
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皇后计划
因此,基本上你所说的是我可以将每个皇后的x和y值存储在另一个二维数组中,然后执行你说明的检查? – Codebug 2010-07-09 01:37:55
@ will:是的,只需存储每个皇后的x和y,然后对每一对皇后进行检查。 – 2010-07-09 02:23:28
你不需要绝对的价值吗? – shinzou 2017-04-10 15:53:43