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

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

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

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

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

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

    public List<List<String>> 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<String> 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());
    }
}

 

posted @ 2021-11-01 22:08  哥们要飞  阅读(25)  评论(0编辑  收藏  举报