Нуждаюсь в помощи С Программой Куинса N (проверяющий диагонали)

Я работаю над программой Куинса 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

6
задан Codebug 9 July 2010 в 01:05
поделиться

2 ответа

Я не думаю, что вы хотите проверять все диагонали, но вместо этого вы можете проверить все ферзя. Вы можете проверить, находятся ли две ферзя на одной диагонали, проверив различия между строками и столбцами двух Q. Если различия одинаковы, они находятся на одной диагонали. (Обычно, если наклон линии между двумя ферзями равен + -1, они находятся на одной диагонали.)

Например, скажем, у вас есть два ферзя Q1 и Q2. Вычислите абсолютное значение разницы в их строках и столбцах.

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

Если deltaRow == deltaCol , ферзи находятся на одной диагонали.

Сделайте это для всех N ферзей.

21
ответ дан 8 December 2019 в 04:51
поделиться

Диагонали могут быть выражены в виде y = x + c или y = c - x. Ваша плата 4x4 будет иметь в общей сложности 10 диагоналей, по 5 для каждого уравнения. Выясните c (они варьируются в зависимости от размера платы) и зацикливайте на x, вычислите y.

Вам придется проверить координаты меньше нуля, верхних границ можно избежать, просто сделав доску в 2 раза больше (в каждом направлении), как это необходимо - другие квадраты всегда пусты, поэтому их проверка не причиняет вреда.

Я даже реализовал проблему N queens без доски вообще - отслеживайте ряды, столбцы и диагонали. В то время это было быстрее, потому что сложение было намного быстрее, чем умножение, но это уже не так.

1
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: