【问题标题】:Need Help With N Queens Program ( checking diagonals )N皇后计划需要帮助(检查对角线)
【发布时间】:2010-07-09 01:05:30
【问题描述】:

我正在开发一个 N Queens 程序,该程序将允许用户将 Queen 配置作为字符串输入。例如, 出现提示时,用户可能会输入类似 Q....Q....Q..Q 的内容。显示为板时的样子:

Q . . .
. Q . .
. . . Q
. . Q .
Is not a solution!

这个程序很简单,因为它假定用户将输入有效信息。我想在返回并添加错误处理之前让程序的主要部分正常工作。

对于那些不熟悉 N 皇后拼图的人来说,基本上你在 N x 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 Queens 计划需要帮助

【问题讨论】:

    标签: java arrays 2d


    【解决方案1】:

    我不认为你想检查所有的对角线,但你可以检查所有的皇后。您可以通过检查两个 Q 的行和列之间的差异来检查两个皇后是否在同一对角线上。如果差异相同,则它们在同一对角线上。 (基本上,如果两个皇后之间的直线斜率为 +-1,则它们在同一对角线上。)

    例如,假设您有两个 Q1 和 Q2。计算它们的行和列的差值的绝对值。

    deltaRow = abs(Q1 row - Q2 row)
    deltaCol = abs(Q1 col - Q2 col)
    

    如果deltaRow == deltaCol,则皇后在同一对角线上。

    对所有 N 个皇后都这样做。

    【讨论】:

    • 所以基本上你的意思是我可以将每个皇后的 x 和 y 值存储在另一个二维数组中,然后执行你说明的检查?
    • @Will:是的,只需存储每个皇后的 x 和 y 并检查每一对。
    • 这里不需要绝对值吗?
    • @kuhaku 是的,当然!我更新了答案。谢谢。
    【解决方案2】:

    如果连接 2 个皇后的直线的斜率为 1 或 -1,我们可以说皇后在同一对角线上。

    q1q2 成为保存每个女王的x 和y 位置的数据结构:

    xDistance = q1.x - q2.x
    yDistance = q1.y - q2.y
    slope = xDistance / yDistance
    

    所以if (Math.abs(slope) == 1) 那么它们在同一个对角线上。

    【讨论】:

    • 这有点危险,如果将整数除以 3/2 可能会得到 1。
    【解决方案3】:

    对角线可以用 y = x + c 或 y = c - x 的形式表示。您的 4x4 棋盘共有 10 条对角线,每个方程 5 条。找出 c(它们根据板的大小而变化)并在 x 上循环,计算 y。

    您必须检查小于零的坐标,只需根据需要将板设置为 2 倍(在每个方向上)即可避免上限 - 其他方格始终为空,因此检查它们不会导致伤害。

    我什至在没有棋盘的情况下实现了 N 个皇后问题——跟踪行、列和对角线。当时这更快,因为加法比乘法快得多,但现在情况已不再如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多