您的位置:首页 > 产品设计 > UI/UE

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

2017-11-27 21:45 351 查看

题目

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
;
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);
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: