Как я могу изменить свой алгоритм NQueens, чтобы он мог реагировать на уже помещенную королеву в первом индексе? - PullRequest
0 голосов
/ 14 октября 2018

Это мой текущий код:

package Queens;

import java.io.IOException;

public class NQueens {

    static class Queen {
        //class that holds positions
        int column, row;
        Queen(int column, int row){
            this.column = column;
            this.row = row;
        }
    }

    public static void main(String[] args) throws IOException {
        //n is subject to change to be read from an input file
        int n = 5;
        Queen position[] = new Queen[n];
        //if solutions are found, print out the coordinates of the queens 
        if (backTracking(n, 0, position)) {
            for(int i = 0; i < n; i++) {
                System.out.println("(" + position[i].column + ", " + position[i].row + ") ");
            } 
        } else {
            System.out.println("No Solution");
        }
    }

    public static boolean isAttacking(int existingQueen, int row, int column, Queen position[]) {
        //determines if attacking or not
        int positionRow = position[existingQueen].row;
        int positionColumn = position[existingQueen].column;

        //if in the same column, row, or diagonal
        if (position[existingQueen].column == column ||
                positionRow == row ||
                positionRow + positionColumn == row + column ||
                positionRow - positionColumn == row - column) {
            return true;
        }
        return false;
    }

    public static boolean backTracking(int n, int row, Queen[] position) {
        //backtracking algorithim
        if (row == n) {
            return true;
        }
        for (int column = 0; column < n; column++) {
            boolean safeSpace = true;
            position[row] = new Queen(column, row);
            for(int existingQueen = 0; existingQueen < row; existingQueen++) {
                if (isAttacking(existingQueen, row, column, position)) {
                    safeSpace = false;
                }
            }
            if (safeSpace) {
                if (backTracking(n, row + 1, position)) {
                    return true;
                }
            }
        }
        return false;
    }
}

Он работает совершенно нормально, как, однако, я хочу сначала поставить ферзь на position[0], а затем алгоритм найти доступные позиции на основеэта королева (она также может переместить начальную королеву).Если он не может найти его, он возвращает "no solution".

Действительно пытаясь выяснить это, поэтому любая помощь будет принята с благодарностью!

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