Модифицировано N королев с размещенной королевой - PullRequest
0 голосов
/ 16 января 2019

Я создаю решатель проблем N Queens с помощью Backtracking. Однако поворот заключается в том, что пользователь устанавливает первую ферзь, а затем выполняется обратный трекинг для обработки остальных 7 королев. Моя программа выполняет эту задачу, и функция обратного отслеживания является функциональной, однако я могу поместить королеву только в первый левый столбец, поскольку параметр, который принимает функция, - это столбец, с которого начинается процедура возврата.

Доска класса

 public boolean solveQueen(int col) { 
     if (col >= board.length) {  
         printBoard();
         System.out.println("queen");
         return true; 
     }

     for (int i = 0; i < board.length; i++)
         if (notUnderAttack(i, col)) {
             placeQ(i, col);
             solveQueen(col + 1);
             removeQ(i, col);  
         }

     return false;         
 }

Основной класс

queen.placeQ(0, 2);
queen.solveQueen(3);
queen.printBoard();

Чтобы решить эту проблему, я попытался обернуть вокруг первой королевы и начать откат назад столбца после первоначального размещения, но проблема здесь в том, что пока он помещает ферзей в столбец 3,4,5,6,7 и предварительно помещает столбец. королева находится во 2-м столбце, в первом столбце нет королев. Я не совсем уверен, как добавить королеву в первом столбце. Я попытался использовать по модулю, но я не уверен, правильно ли я это реализовал, поэтому я удалил его.

public boolean notUnderAttack(int row, int col) {    
    if ((rowCheck(row) == false) || (colCheck(col) == false) || (diagonalCheck(row, col) == false)) {
        return false; 
    }
    return true; 
}

1 Ответ

0 голосов
/ 16 января 2019

Вы можете сохранить столбец исходной королевы, а затем пропустить этот столбец solveQueen. или же. создайте метод, который проверяет королеву в столбце уже и пропускает на основе этого. А потом всегда просто звоните solveQueen(1) Первое решение хорошо (более эффективно), если вы когда-нибудь захотите поставить 1-ю королеву. Второе лучше, если вы можете расширить это, чтобы обрабатывать несколько помещенных начальных ферзей.

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