力扣labuladong一刷day70天回溯大集合

力扣labuladong一刷day70天回溯大集合

文章目录

      • 力扣labuladong一刷day70天回溯大集合
      • 一、51. N皇后
      • 二、37. 解数独

一、51. N皇后

题目链接:https://leetcode.cn/problems/n-queens/
思路:n皇后问题,利用回溯来搜索正确答案,每次向下递归都是新的一层,进入递归之前都会做是否可以作为皇后的判断。

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

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

    void backTracking(int n, int index, char[][] cList) {
        if (index == n) {
            List<String> list = new ArrayList<>();
            for (char[] chars : cList) {
                list.add(String.valueOf(chars));
            }
            arrayLists.add(list);
            return;
        }
        for (int i = 0; i < n; i++) {
            if (!isTrue(n, index, i, cList)) continue;
            cList[index][i] = 'Q';
            backTracking(n, index+1, cList);
            cList[index][i] = '.';
        }
    }
    boolean isTrue(int n, int x, int y, char[][] cList) {
        for (int i = 0; i < x; i++) {
            if (cList[i][y] == 'Q') return false;
        }
        for (int i = x-1, j = y-1; i >= 0 && j >= 0; i--, j--) {
            if (cList[i][j] == 'Q') return false;
        }
        for (int i = x-1, j = y+1; i >= 0 && j < n ; i--, j++) {
            if (cList[i][j] == 'Q') return false;
        }
        return true;
    }
}

二、37. 解数独

题目链接:https://leetcode.cn/problems/sudoku-solver/description/
思路:思路和n皇后类似,不过为了避免结尾搜集元素要copy数组,可以使用带返回值的回溯,搜索到答案后返回。

class Solution {
    public void solveSudoku(char[][] board) {
        backTracking(board);
    }

    boolean backTracking(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') continue;
                for (char k = '1'; k <= '9'; k++) {
                    if (!isTrue(board, i, j, k)) continue;
                    board[i][j] = k;
                    if (backTracking(board)) return true;
                    board[i][j] = '.';
                }
                return false;
            }
        }
        return true;
    }

    boolean isTrue(char[][] board, int x, int y, int v) {
        for (int i = 0; i < 9; i++) {
            if (board[i][y] == v) return false;
            if (board[x][i] == v) return false;
        }
        int a = (x/3) * 3, b = (y/3)*3;
        for (int i = a; i < a+3 ; i++) {
            for (int j = b; j < b+3; j++) {
                if (board[i][j] == v) return false;
            }
        }
        return true;
    }

}

你可能感兴趣的:(力扣算法题,leetcode,算法,职场和发展)