代码随想录day30

第30天

前言

N皇后

题目

思路

我们需要
1、判断二维数组中的行和列
2、棋盘中不能再同一行,不能再同一列,不能出现再对角线上
3、回溯模板

代码

class Solution {
    List<List<String>> res;
    public List<List<String>> solveNQueens(int n) {
        char[][] board = new char[n][n];
        for(char[] c:board){
            Arrays.fill(c,'.');
        }
        res = new ArrayList<>();
        backTracking(board,0,n);
        return res;
    }
    public void backTracking(char[][] board,int row,int n){
        if(row == n){
            List<String> arr = new ArrayList<>();
            for(int i = 0;i < n;i++){
                StringBuffer buffer = new StringBuffer();
                for(int j = 0;j < n;j++){
                    if(board[i][j] == 'Q'){
                        buffer.append('Q');
                    }else{
                        buffer.append('.');
                    }
                }
                arr.add(buffer.toString());
            }
            res.add(new ArrayList<>(arr));
            return;
        }
        for(int i = 0;i < n;i ++){
            if(isVaild(row,i,board,n)){
                board[row][i] = 'Q';
                backTracking(board,row + 1,n); //回溯
                board[row][i] = '.';
            }
        }


    }
    public boolean isVaild(int row,int col,char[][] board,int n){
        // 只用判断列,不用判断行
        for(int i = 0;i < row;i ++){
            if(board[i][col] == 'Q'){
                return false;
            }
        }
        // 判断45度角
        for(int i = row - 1,j = col -1; i >= 0 && j >= 0;i--,j--){
            if(board[i][j] == 'Q'){
                return false;
            }
        }
        // 判断135度角
        for(int i = row - 1,j = col + 1;i >= 0 && j <= n - 1;i--,j++){
            if(board[i][j] == 'Q'){
                return false;
            }
        }
        return true;
    }
}

37. 解数独

class Solution {
    public void solveSudoku(char[][] board) {
        dfs(board);
    }
    public boolean dfs(char[][] board){
        // if(row == board.length){
        //     return;
        // }
        for(int i = 0;i < board.length;i ++){
            for(int j = 0 ;j < board.length;j ++){
                // 我们递归的是里面的数字行不行
                if(board[i][j] != '.'){
                    continue;
                }
                for(char k = '1';k <='9';k++ ){
                    if(isValid(i,j,board,k)){
                        board[i][j] = k;
                        if(dfs(board)){
                            return true;
                        }
                        board[i][j] = '.';
                    }
                }
                return false;
            }
        }
        return true;
    }

    public boolean isValid(int row,int col,char[][] board,char k){
        // 判断哪一行是否存在K
        for(int i = 0; i < 9;i ++){
            if(board[i][col] == k){
                return false;
            }
        }
        // 判断那一列是否存在k
         for(int i = 0; i < 9;i ++){
            if(board[row][i] == k){
                return false;
            }
        }
        // 判断酒宫格
        int startRow = (row / 3) * 3;
        int startCol = (col / 3) * 3;
        for(int i = startRow;i < startRow + 3;i ++){
            for(int j = startCol;j < startCol + 3;j++){
                if(board[i][j] == k){
                    return false;
                }
            }
        }
        return true;
    }
    
}

你可能感兴趣的:(算法打卡,深度优先,算法,leetcode)