https://www.programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E8%A1%A5%E5%85%85

class Solution { List<List<String>> result = new ArrayList<>(); private void backTracking(int n, int row, char[][] chessboard) { //终止条件 if (row == n) { result.add(Array2List(chessboard)); } //单层搜索的逻辑: //递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。 for (int col = 0; col < n; col++) { if (isValid(row, col, chessboard, n)) { // 验证合法就可以放 chessboard[row][col] = 'Q';//放置皇后 backTracking(n, row + 1, chessboard);//递归 chessboard[row][col] = '.';//回溯 将棋盘重置为. } } } public List<List<String>> solveNQueens(int n) { //初始化棋盘,全部为... char[][] chessboard = new char[n][n]; for (char[] c : chessboard) { //'.' 表示空,'Q' 表示皇后,初始化空棋盘。 Arrays.fill(c, '.'); } backTracking(n,0,chessboard); return result; } public List Array2List(char[][] chessboard) { List<String> list = new ArrayList<>(); for (char[] c : chessboard) { list.add(String.copyValueOf(c)); } return list; } /** * 校验 * 不能同行 * 不能同列 * 不能同斜线 (45度和135度角) * * @param row * @param col * @param chessboard * @param n * @return */ private boolean isValid(int row, int col, char[][] chessboard, int n) { //检验列 for (int i = 0; i < row; i++) { if (chessboard[i][col] == 'Q') { return false; } } //检查45°是否有皇后 for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { if (chessboard[i][j] == 'Q') { return false; } } //检查135° for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (chessboard[i][j] == 'Q') { return false; } } return true; }}