leetcode解题方案--051--N-Queens

来源:互联网 发布:mac系统的ipa文件 编辑:程序博客网 时间:2024/05/19 19:57

题目

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
[“.Q..”, // Solution 1
“…Q”,
“Q…”,
“..Q.”],

[“..Q.”, // Solution 2
“Q…”,
“…Q”,
“.Q..”]
]

分析

递归?或者叫回溯

就是不断的试啊,有条件不符合的就返回

class Solution {    public static List<List<String>> solveNQueens(int n) {        List<List<String>> ret = new LinkedList<>();        boolean[] used = new boolean[n];        LinkedList<String> list = new LinkedList<>();        HashSet<Integer> diff = new HashSet<>(2*n-1);        HashSet<Integer> sum = new HashSet<>(2*n-1);        calculate(ret, list, n, used, -65535, diff, sum);        return ret;    }    public static void calculate(List<List<String>> ret, List<String> list, int n, boolean[] used,                                 int lastIndex, HashSet diff, HashSet sum) {        if (list.size() == n) {            ret.add(list);        }        for (int i = 0; i<n;i++) {            if (!used[i] && i!=lastIndex-1 && i!=lastIndex+1&&!diff.contains(list.size()-i) && !sum.contains(list.size()+i)) {                LinkedList<String> listtmp = new LinkedList<>();                listtmp.addAll(list);                used[i] = true;                diff.add(list.size() - i);                sum.add(list.size()+i);                StringBuffer str = new StringBuffer("");                for (int j = 0; j<n;j++) {                    if (j == i) {                        str.append("Q");                    } else {                        str.append(".");                    }                }                listtmp.add(str.toString());                calculate(ret, listtmp, n, used,i,diff, sum);                used[i] = false;                diff.remove(list.size()-i);                sum.remove(list.size()+i);            }        }    }}