51. N 皇后

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    // 做完数独的题,就会有固有思维。一个一个的试,但是一行只能有一个,那么一个一个试其中有可能n-1次都是无效的。
    // 所以按照行为单位,一行中放一个,之后进入下一行的逻辑
    List<List<String>> ret = new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {
        char[][] board = new char[n][n];
        dfs(board,0);
        return ret;

        

    }

    public void dfs(char[][] board, int row) {
        if(row == board.length) {
            // 既然已经到了这步,说明每一行都放了。
            List<String> list = new ArrayList<>();
            for(int i=0;i<board.length;i++) {
                StringBuilder sb = new StringBuilder();
                for(int j=0;j<board.length;j++) {
                    // 这里追加的时候注意:就是如果一个位置成功了,那么这行的后面都是空的,所以特殊处理下
                    
                    sb.append(board[i][j] == 'Q' ? 'Q' : '.');
                }
                list.add(sb.toString());
            }
            ret.add(list);
            return;
        }
        // 对于该行来说,有n中选择。每一个都试
        for(int i=0;i<board.length;i++) {
            if(!checkOther(board,row,i)) {
                continue;
            }
            board[row][i] = 'Q';
            dfs(board,row+1);
            board[row][i] = '.';
        }
    }

    


    public boolean checkOther(char[][] board,int row, int col) {

        for(int i=0;i<board.length;i++) {
            if(board[row][i] == 'Q') {
                return false;
            }
        }

        for(int i=0;i<board.length;i++) {
            if(board[i][col] == 'Q') {
                return false;
            }
        }

        int p=row;
        int q=col;

        while(q>=0 && p>=0) {
            if(board[p][q] == 'Q') {
                return  false;
            }
            p--;
            q--;
        }

        p=row;
        q=col;

        while(p>=0 && q<board.length) {
            if(board[p][q] == 'Q') {
                return false;
            }
            p--;
            q++;
        }

        p=row;
        q=col;

        while(p<board.length && q >=0) {
            if(board[p][q] == 'Q') {
                return false;
            }
            p++;
            q--;
        }

        p=row;
        q=col;

        while(p<board.length && q<board.length) {
            if(board[p][q] == 'Q') {
                return false;
            }
            p++;
            q++;
        }

        return true;
 
    }

posted @ 2022-03-01 10:52  一颗青菜  阅读(5)  评论(0)    收藏  举报