美文网首页
Leetcode 精选之搜索( N皇后)

Leetcode 精选之搜索( N皇后)

作者: Kevin_小飞象 | 来源:发表于2020-04-06 20:20 被阅读0次

    题目描述

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


    image

    上图为 8 皇后问题的一种解法。

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

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

    示例:

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

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

    题目链接:力扣

    解题思路

    class Solution {
        private List<List<String>> solutions;
        private char[][] nQueens;
        private boolean[] colUsed;
        private boolean[] diagonals45Used;
        private boolean[] diagonals135Used;
        private int n;
    
        public List<List<String>> solveNQueens(int n) {
            solutions = new ArrayList<>();
            nQueens = new char[n][n];
            for (int i = 0; i < n; i++) {
                Arrays.fill(nQueens[i], '.');
            }
            colUsed = new boolean[n];
            diagonals45Used = new boolean[2 * n - 1];
            diagonals135Used = new boolean[2 * n - 1];
            this.n = n;
            backtracking(0);
            return solutions;
        }
    
        private void backtracking(int row) {
            if (row == n) {
                List<String> list = new ArrayList<>();
                for (char[] chars : nQueens) {
                    list.add(new String(chars));
                }
                solutions.add(list);
                return;
            }
    
            for (int col = 0; col < n; col++) {
                int diagonals45Idx = row + col;
                int diagonals135Idx = n - 1 - (row - col);
                if (colUsed[col] || diagonals45Used[diagonals45Idx] || diagonals135Used[diagonals135Idx]) {
                    continue;
                }
                nQueens[row][col] = 'Q';
                colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = true;
                backtracking(row + 1);
                colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = false;
                nQueens[row][col] = '.';
            }
        }
    }
    

    测试结果

    image.png

    相关文章

      网友评论

          本文标题:Leetcode 精选之搜索( N皇后)

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