public class Solution { private int[] rows; private int[] hills; private int[] dales; private int[] queens; private int n; private List<List> res = new ArrayList<>();

public List<List<String>> solveNQueens(int n) {
    this.n = n;
    rows = new int[n];
    hills = new int[2 * n - 1];
    dales = new int[2 * n - 1];
    queens = new int[n];
    Arrays.fill(rows, 0);
    Arrays.fill(hills, 0);
    Arrays.fill(dales, 0);
    Arrays.fill(queens, -1);
    backtrack(0);
    return res;
}

private void backtrack(int row) {
    if (row == n) {
        res.add(generateBoard());
        return;
    }
    for (int col = 0; col < n; col++) {
        if (isNotUnderAttack(row, col)) {
            placeQueen(row, col);
            backtrack(row + 1);
            removeQueen(row, col);
        }
    }
}

private boolean isNotUnderAttack(int row, int col) {
    return rows[col] + hills[row - col + n - 1] + dales[row + col] == 0;
}

private void placeQueen(int row, int col) {
    queens[row] = col;
    rows[col] = 1;
    hills[row - col + n - 1] = 1;
    dales[row + col] = 1;
}

private void removeQueen(int row, int col) {
    queens[row] = -1;
    rows[col] = 0;
    hills[row - col + n - 1] = 0;
    dales[row + col] = 0;
}

private List<String> generateBoard() {
    List<String> board = new ArrayList<>();
    for (int i = 0; i < n; i++) {
        char[] row = new char[n];
        Arrays.fill(row, '.');
        row[queens[i]] = 'Q';
        board.add(new String(row));
    }
    return board;
}

}

N皇后问题回溯法解法:Java代码实现

原文地址: https://www.cveoy.top/t/topic/nW4O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录