https://leetcode.cn/problems/n-queens/添加链接描述
题目要求
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
回溯
class Solution {
List<List<String>> res = new ArrayList<>();
boolean[] usedCol, usedDiag45, usedDiag135;
public List<List<String>> solveNQueens(int n) {
usedCol = new boolean[n];
usedDiag45 = new boolean[2 * n - 1];
usedDiag135 = new boolean[2 * n - 1];
int[] board = new int[n];
backtrack(board, n, 0);
return res;
}
private void backtrack(int[] board, int n, int row) {
// 每一次列都放置了皇后,保存结果
if (row == n) {
List<String> list = new ArrayList<>();
for (int i : board) {
char[] str = new char[n];
Arrays.fill(str, '.');
str[i] = 'Q';
list.add(String.valueOf(str));
}
res.add(list);
return;
}
for (int col = 0; col < n; col++) {
// 某一列或斜线已经放置了皇后
if (usedCol[col] || usedDiag45[row + col] || usedDiag135[row - col + n - 1])
continue;
// 记录皇后放置位置
board[row] = col;
usedCol[col] = true;
usedDiag45[row + col] = true;
usedDiag135[row - col + n - 1] = true;
backtrack(board, n, row + 1);
usedDiag135[row - col + n - 1] = false;
usedDiag45[row + col] = false;
usedCol[col] = false;
}
}
}
- 递归的深度来表示棋盘的行,用for循环来表示棋盘的列;维护一个board数组来表示下标index的行上皇后被放置在了哪一个位置;
- 用三个数组来标记列,45°斜线,135°斜线,如果已经有皇后存在,则遍历下一个位置,直到n个皇后都被放置,则保存结果;