回溯困难 LeetCode51. N 皇后

描述

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

分析

回溯的解法也可以理解为,回溯穷尽了所有n个皇后的放置位置可能结果,对不可能的位置做剪枝。

    整个n*n大小的皇后可选位置用n*n的二维字符数组表示,数组方便后面判断可不可以放置"Q"。 递归n层,若当前的层数是n,说明已经递归了n层,要结束了。 每一层都要遍历n个位置,判断可不可以是"Q"
class Solution {
          
   
    List<String> li = new ArrayList<>();
    List<List<String>> res = new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {
          
   
        char[][] queen = new char[n][n];
        backTracking(n,0,queen);
        return res;
    }

    public void backTracking(int n, int row, char[][] queen){
          
   
        if(row == n){
          
   
            res.add(new ArrayList<String>(li));
            return ;
        }
        for(int i = 0; i < n; i++){
          
   
            if(!isAvalible(queen,row,i)){
          
   
                continue;
            }
            queen[row][i] = Q;
            String str = "";
            for(int j = 0; j < n; j++){
          
   
                if(queen[row][j] != Q){
          
   
                    str+=.;
                }else{
          
   
                    str+=Q;
                }
            }
            li.add(str);
            backTracking(n,row+1,queen);
            queen[row][i] = .;
            li.remove(li.size()-1);
        }
    }

    public boolean isAvalible(char[][] queen, int row, int col){
          
   
        for(int i = 0; i < row; i++){
          
   
            if(queen[i][col] == Q){
          
   
                return false;
            }
        }
        for(int i = row, j = col; i >= 0 && j < queen.length; i--,j++){
          
   
            if(queen[i][j] == Q){
          
   
                return false;
            }
        }
        for(int i = row, j = col; i >= 0 && j >= 0; i--,j--){
          
   
            if(queen[i][j] == Q){
          
   
                return false;
            }
        }
        return true;
    }
}
经验分享 程序员 微信小程序 职场和发展