n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
class Solution {
private int[] x;
private static int count = 0;
private List<List<String>>list=new ArrayList<List<String>>();
public List<List<String>> solveNQueens(int n) {
x=new int [n];
this.nQueens(0);
return list;
}
// num1是当前放皇后的列数
private boolean judge(int num1) {
for (int j = 0; j < num1; j++) {
// 如果当前传入的第K行上的皇后放置的位置和其它皇后一个对角线(abs(x[k]- x[j])==abs(k-j)
// 或一个直线上(x[j] == x[k])
if (Math.abs(num1 - j) == Math.abs(x[num1] - x[j]) || x[num1] == x[j]) {
return false;
}
}
return true;
}
public void nQueens(int num) {
for (int i = 0, len = x.length; i < len; i++) {
// 如果条件成立 说明有一个可行解 输出
if (num == len) {
List<String>list1=new ArrayList<String>();
for (int j = 0; j < len; j++) {
StringBuffer str=new StringBuffer();
for (int k = 0; k < len; k++) {
if (x[j] == k + 1) {
str.append("Q");
} else {
str.append(".");
}
}
list1.add(str.toString());
}
this.list.add(list1);
return;
} else {
x[num] = i + 1;
//
if (judge(num)) {
nQueens(num + 1);
}
}
}
}
}