N-Queens II
39% Accepted
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
Have you met this question in a real interview? Yes
Example
For n=4, there are 2 distinct solutions.
Tags Expand
- Recursion
思路
- 跟N-Queen I一样,就是输出结果的size
- 我直接复制战列N-Queen 去掉了draw function
- 再做的可以优化,因为并不需要记录结果,所以不需要result这个arraylist,直接使用一个sum,每次合格,就sum++就行了
public class Solution {
    /**
     * @param n: The number of queens.
     * @return: The total number of distinct solutions.
     */
    class Position {
        int x;
        int y;
        Position(int x, int y) {
            this.x = x;
            this.y = y;
        }
    } 
    public int totalNQueens(int n) {
        // write your code here
        if (n <= 0) {
            return 0;
        }
        List<List<Position>> results = new ArrayList<List<Position>>();
        List<Position> list = new ArrayList<Position>();
        dfs(results, list, n, 0);
        return results.size();
    }
    public void dfs(List<List<Position>> results, List<Position> list, int n, int level) {
        if (list.size() == n) {
            results.add(new ArrayList<Position>(list));
            return;
        }
        for (int i = 0; i < n; i++) {
            Position cur = new Position(level, i);
            if (!checkRule(list, cur)) {
                continue;
            }
            list.add(cur);
            dfs(results, list, n, level + 1);
            list.remove(list.size() - 1);
        }
    }
    public boolean checkRule(List<Position> list, Position cur) {
        for (Position prev : list) {
            if (prev.x == cur.x || prev.y == cur.y) {
                return false;
            }
            if (Math.abs(prev.x - cur.x) == Math.abs(prev.y - cur.y)) {
                return false;
            }
        }
        return true;
    }
}