回溯法:LeetCode:51. N 皇后问题

解题思路

最开始写理解错了,注意!!!(N皇后要求的是所在的列和行,以及斜方向上都不存在其他皇后) 我们需要将皇后一层一层的探索尝试,判断其是否在当前位置上能够放置 并且在一次完成后需要对现场进行恢复 如果觉得理解起来有点困难的话,可以尝试着先对皇后排列情况进行穷举,不考虑其要求,然后在这样的基础上,再去进行修改,相信大家就都能理解并且掌握这道题目了

代码

class Solution {
          
   
    List<List<String>> ans;
    String[][] map;
    public List<List<String>> solveNQueens(int n) {
          
   
        ans = new ArrayList<>();
        map = new String[n][n];
        for (int i=0;i<n;i++){
          
   
            for (int j=0;j<n;j++){
          
   
                map[i][j]=".";
            }
        }
        LinkedList<String> road = new LinkedList<>();
        backtrack(0,n,road);
        return ans;
    }
    //进行搜索和回溯
    public void backtrack(int row, int n, LinkedList<String> road){
          
   
        //1.终止条件
        if (road.size()==n){
          
   
            ans.add(new LinkedList<>(road));
            return;
        }
        for(int i=0;i<n;i++){
          
   
            //2.尝试放置
            if (judge(row,i,n)) map[row][i]="Q";
            else continue;
            String string = "";
            for (int j=0;j<n;j++){
          
   
                string+=map[row][j];
            }
            road.add(string);
            //3.继续递归
            backtrack(row+1, n, road);
            //4.状态恢复
            map[row][i]=".";
            road.removeLast();
        }
    }
    //判断皇后是否被攻击
    public boolean judge(int x,int y,int n){
          
   
        for (int i=x,j=0;j<n;j++){
          
   
            if (map[i][j].equals("Q")) return false;
        }
        for (int i=y,j=0;j<n;j++){
          
   
            if (map[j][i].equals("Q")) return false;
        }
        for (int i=x,j=y;i<n&&j<n;i++,j++){
          
   //右下斜
            if (map[i][j].equals("Q")) return false;
        }
        for (int i=x,j=y;i>=0&&j<n;i--,j++){
          
   //右上斜
            if (map[i][j].equals("Q")) return false;
        }
        for (int i=x,j=y;i<n&&j>=0;i++,j--){
          
   //左下斜
            if (map[i][j].equals("Q")) return false;
        }
        for (int i=x,j=y;i>=0&&j>=0;i--,j--){
          
   //左上斜
            if (map[i][j].equals("Q")) return false;
        }
        return true;
    }
}
经验分享 程序员 微信小程序 职场和发展