回溯法:
class Solution {
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
// 定义array数组用于存放每一行中皇后的列号
int[] array = new int[n];
getResult(n, 0, array);
return res;
}
public void getResult(int n, int index, int[] array) {
if(index == n) {
List<String> temp = new ArrayList<>();
for(int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder();
for(int j = 0; j < n; j++) {
if(array[i] == j) sb.append("Q");
else sb.append(".");
}
temp.add(sb.toString());
}
res.add(temp);
return;
}
//现在应当摆放第index行的皇后,遍历该行的每一列,判断能不能放在这个位置。
for(int i = 0; i < n; i++) {
array[index] = i;
if(canPlace(index, array)) { //这个位置可以放就计算下一行
getResult(n, index + 1, array);
}
}
}
//只需要判断index之前行的状态,列号是否相同,或是否在同一对角线。
public boolean canPlace(int index, int[] array) {
for(int i = 0; i < index; i++) {
if(array[i] == array[index] || (index - i) == Math.abs(array[index] - array[i]))
return false;
}
return true;
}
}