【每日一题】【回溯backtrace】N皇后

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

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

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

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

【每日一题】【回溯backtrace】N皇后_第1张图片

class Solution {
    private List> res = new ArrayList<>();
    private List path = new ArrayList<>();

    public List> solveNQueens(int n) {
        backTracking(n);
        return res;
    }
    private void backTracking(int n) {
        if (path.size() == n) {
            res.add(getResult());
        }
        for (int j = 0; j < n; j++) {
            if (invalid(path.size(), j)) continue;
            path.add(j);
            backTracking(n);
            path.remove(path.size() - 1);
        }
    }
    private boolean invalid(int x, int y) {
        for (int i = 0; i < path.size(); i++) {
            int j = path.get(i);
            if (i == x || j == y || i - j == x - y || i + j == x + y) {
                return true;
            }
        }
        return false;
    }

    private List getResult() {
        return path.stream().map(
            row -> {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < path.size(); i++) {
                    sb.append(i == row ? "Q" : ".");
                }
                return sb.toString();
            }
        ).collect(Collectors.toList());
    }
}

你可能感兴趣的:(算法,java,开发语言)