LeetCode——N皇后

Q:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
PS:皇后可以攻击同⼀⾏、同⼀列、左上左下右上右下四个⽅向的任意单位。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],

["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

A:回溯法

    private List<List<String>> result = new ArrayList<>();

    public List<List<String>> solveNQueens(int n) {
        if (n == 0)
            return result;
        List<Integer> l = new ArrayList<>();
        if (n == 1) {
            List<String> l1 = new ArrayList<>();
            l1.add("Q");
            result.add(l1);
            return result;
        }
        help(0, n, l);
        return result;
    }

    private void help(int row, int n, List<Integer> l) {
        if (row == n) {
            List<String> strList = new ArrayList<>();
            for(Integer num : l){
                char[] t = new char[n];
                Arrays.fill(t,'.');
                t[num] = 'Q';
                strList.add(new String(t));
            }
            result.add(strList);
            return;
        }
        for (int col = 0; col < n; col++) {
            if (!l.contains(col)) {
                if (!isDiagonal(l, col)) {
                    l.add(col);
                    help(row + 1, n, l);
                    l.remove(l.size() - 1);
                }
            }
        }
    }

    private boolean isDiagonal(List<Integer> currentQueen, int col) {
        int currentRow = currentQueen.size();
        for (int row = 0; row < currentQueen.size(); row++) {
            //判断对角线
            if (Math.abs(currentRow - row) == Math.abs(col - currentQueen.get(row))) {
                return true;
            }
        }
        return false;
    }
原文地址:https://www.cnblogs.com/xym4869/p/12630902.html