力扣51题(n皇后)

51.N皇后

基本思想:

回溯算法 

基本思想:

代码随想录抄的

 n皇后就是普通组合问题

 

 

 

递归深度就是row控制棋盘的⾏,也就是二维矩阵的高
每⼀层⾥for循环的col控制棋盘的列,⼀⾏⼀列,确定了放置皇后的位置
1.递归参数:二维数组result,棋盘大小n,记录遍历到第几层的row
2.递归终止条件:row == n
if (row == n) {
    result.push_back(chessboard);
    return;
}
3.单层搜索逻辑:
每次都要从新的一行的起始位置开始搜,所以col都是从0开始
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] = '.'; // 回溯,撤销皇后
    }
}

4.验证棋牌是否合法

  1. 不能同行
  2. 不能同列
  3. 不能同斜线 (45度和135度角)

不需要再代码中检查,是否同行

因为在单层搜索的过程中,每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重了。

代码:

class Solution {
    List<List<String>> res = new ArrayList<>();

    public List<List<String>> solveNQueens(int n) {
        char[][] chessboard = new char[n][n];
        for (char[] c : chessboard) {
            Arrays.fill(c, '.');
        }
        backTrack(n, 0, chessboard);
        return res;
    }


    public void backTrack(int n, int row, char[][] chessboard) {
        if (row == n) {
            res.add(Array2List(chessboard));
            return;
        }

        for (int col = 0;col < n; ++col) {
            if (isValid (row, col, n, chessboard)) {
                chessboard[row][col] = 'Q';
                backTrack(n, row+1, chessboard);
                chessboard[row][col] = '.';
            }
        }

    }


    public List Array2List(char[][] chessboard) {
        List<String> list = new ArrayList<>();

        for (char[] c : chessboard) {
            list.add(String.copyValueOf(c));
        }
        return list;
    }


    public boolean isValid(int row, int col, int n, char[][] chessboard) {
        // 检查列
        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>=0; i--, j--) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }

        // 检查135度对角线
        for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }
        return true;
    }
}

 

posted @ 2021-10-17 22:08  最近饭吃的很多  阅读(63)  评论(0编辑  收藏  举报