美文网首页
回溯算法 - N皇后问题

回溯算法 - N皇后问题

作者: myserendipit | 来源:发表于2020-05-30 22:01 被阅读0次

回溯算法

  • 实际上就是一个决策树的遍历过程
  1. 路径:已经做出的选择
  2. 选择列表:是你当前可以做的选择
  3. 结束条件:到达决策树底层,无法再做选择的条件
  • 经典问题:【全排列】【N皇后问题】

1. 全排列问题

https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL3N6X21tYml6X2pwZy9naWJrSXowTVZxZEYxdW1BZHlYdVBxNTRpYnc3WDIzbW5hR0ppYW1idHBxYzR2a2hzcVpZb0VaV2lhbmlic0ltdER2bVhSTUNKdVVCOGdrTGZDSlZBUUR0MlJBLzY0MD93eF9mbXQ9anBlZw?x-oss-process=image/format,png

 // 全排列问题
 public class Backtrack {
     List<List<Integer>> res = new LinkedList<>();
     List<List<Integer>> permute(int[] nums) {
         LinkedList<Integer> list  = new LinkedList<>();
         backtrack(nums, list);
         return res;
     }
 ​
     void backtrack(int[] nums, LinkedList<Integer> list) {
         if (nums.length == list.size()) {
             res.add(list);
             return;
         }
         for (int i = 0; i < nums.length - 1; i++) {
             if (list.contains(nums[i])) {
                 continue;
             }
             // 做决策
             list.add(nums[i]);
             // 进入下一层决策树
             backtrack(nums, list);
             // 取消决策
             list.removeLast();
         }
     }
 }

2. N皇后问题

  • 给你一个NxN的期盼,让你放置N个皇后,使得他们不能互相攻击

  • 皇后可以攻击同一行,同一列,左上左下,右上右下 四个方向的任意单位

  • 解法也就是上述全排列方案的适当调整

    • 添加了isValid()的函数校验是否有皇后冲突
    • 初始化了一个字符串链表棋盘
public class Backtrack {

    List<List<String>> queueMatrix = new LinkedList<>();
    List<String> board = new LinkedList<>();

    int n = 0;

    List<List<String>> solveNQueens(int n) {
        this.n = n;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) sb.append('.');
        for (int i = 0; i < n; i++) board.add(sb.toString());
        queenBacktrack( 0);
        return queueMatrix;
    }

    void queenBacktrack(int row) {
        if (row == n) {
            // 结束了一次决策树(全排列)
            queueMatrix.add(new LinkedList<>(board));
            return;
        }
        for (int col = 0; col < n; col++) {
            if (!isValid(row, col)) {
                continue;
            }
            // 合法,做决策
            StringBuilder sb = new StringBuilder(board.get(row));
            sb.setCharAt(col, 'Q');
            board.set(row, sb.toString());
            // 递归
            queenBacktrack(row + 1);
            // 回退
            StringBuilder sb2 = new StringBuilder(board.get(row));
            sb2.setCharAt(col, '.');
            board.set(row, sb2.toString());
        }
    }

    boolean isValid(int row, int col) {
        for (int i = 0; i < row; i++) {
            // 上面不能有Q
            if (board.get(i).charAt(col) == 'Q') {
                return false;
            }
        }
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            // 左上方,不能有Q
            if (board.get(i).charAt(j) == 'Q') {
                return false;
            }
        }
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
            // 右上方,不能有Q
            if (board.get(i).charAt(j) == 'Q') {
                return false;
            }
        }
        return true;
    }
}

相关文章

  • 回溯算法 - N皇后问题

    回溯算法 实际上就是一个决策树的遍历过程 路径:已经做出的选择 选择列表:是你当前可以做的选择 结束条件:到达决策...

  • N皇后

    回溯法核心代码: n皇后问题回溯法

  • 算法(11):回溯法

    今天补一下回溯法,别的不说,n皇后问题必须列出来才行~ 目录:算法:附录算法(1):递归算法(2):链表算法(3)...

  • 51. N-Queens

    题目分析 N 皇后问题 + 回溯法 代码

  • 八皇后-回溯算法

    在之前的文章里,我们介绍了图相关的一些算法。今天我们通过N皇后问题来讨论下回溯算法。 首先,我们先介绍下什么是回溯...

  • LeetCode 51. N-Queens

    Leetcode : N-QueensDiffculty:Hard N皇后问题,对八皇后问题的扩展,典型的回溯法算...

  • 算法-递归回溯N皇后问题

    51. N 皇后[https://leetcode-cn.com/problems/n-queens/] 皇后的摆...

  • 怎样应对IT面试与笔试-(八)

    Backtracking(回溯法) 51. N-Queens 经典的N皇后问题,将n个皇后放到n*n的棋盘上,使得...

  • LeetCode-N Queens

    N皇后问题。经典回溯问题: 以下是递归及非递归的方法:

  • 每日一题:n queues

    题目:在n阶棋盘上放n个皇后,皇后在横竖斜都不能重复。分析:这是一道典型的回溯算法算法:1>如果当前的格子是可以放...

网友评论

      本文标题:回溯算法 - N皇后问题

      本文链接:https://www.haomeiwen.com/subject/xxckzhtx.html