LeetCode-52.N皇后 II(相关话题:回溯算法)

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

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

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

示例:

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

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

解题思路:本题与上一题(51.N皇后问题)思路相同,不同点在于上一题是保存每种具体解法,本次是记录多少种解决方案。

java代码:

class Solution {
    int cnt = 0;
    public int totalNQueens(int n) {
        boolean[] line = new boolean[n];//line[i]记录第i行是否有皇后
        boolean[] col = new boolean[n];//col[i]记录第i列是否有皇后
        boolean[] leftDiagonal = new boolean[2*n-1];//leftDiagonal[i]记录从上往下数第i条左斜对角线是否有皇后
        boolean[] rightDiagonal = new boolean[2*n-1];//rightDiagonal[i]记录从上往下数第i条右斜对角线是否有皇后

        dfs(0, 0, line, col, leftDiagonal, rightDiagonal);
        return cnt;
    }

    private void dfs(int s, int queen, boolean[] line, boolean[] col, boolean[] left, boolean[] right){
        int n = line.length;

        for(; s < n*n; s++){
            int h = s/n, l = s%n;
            if(line[h] || col[l] || left[h+l] || right[Math.abs(l-h-(n-1))]){
                continue;
            }

            queen++;
            line[h] = true;
            col[l] = true;
            left[h+l] = true;
            right[Math.abs(l-h-(n-1))] = true;
            dfs(s+1, queen, line, col, left, right);

            queen--;
            line[h] = false;
            col[l] = false;
            left[h+l] = false;
            right[Math.abs(l-h-(n-1))] = false;
        }

        if(n == queen){
            cnt++;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38823568/article/details/81735941