Нужна помощь с программой N Queens (проверка диагоналей) - PullRequest
6 голосов
/ 09 июля 2010

Я работаю над программой N Queens, которая позволит пользователю вводить конфигурацию Queen в виде строки.Например, при появлении запроса пользователь может ввести что-то вроде Q .... Q ..... Q..Q.который при отображении в виде доски будет выглядеть так:

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

Эта программа проста в том смысле, что она предполагает, что пользователь введет правильную информацию.Я хотел бы, чтобы основная часть программы работала, прежде чем я вернусь и добавлю обработку ошибок.

Для тех, кто не знаком с загадкой N Queens, в основном у вас есть N Queens на доске N x 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

Ответы [ 3 ]

21 голосов
/ 09 июля 2010

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

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

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

Если deltaRow == deltaCol, королевы имеют одинаковую диагональ.

Просто сделайте это для всех N королев.

2 голосов
/ 29 декабря 2015

Можно сказать, что королевы находятся на одной диагонали, если наклон линии, соединяющей 2 королевы, равен либо 1, либо -1.

Пусть q1 и q2 быть структурами данных, содержащими позиции x и y каждой королевы:

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

Так что if (slope.abs() == 1) тогда они находятся на одной диагонали.

1 голос
/ 09 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...