题目链接
class Solution {
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
if(n<=0) return res;
int[] colForRow = new int[n];
NQueensCore(n,0,colForRow);
return res;
}
public void NQueensCore(int n,int rows, int[] colForRow){
if(rows==n){
ArrayList<String> item = new ArrayList<String>();
for(int i=0; i<n; i++){
StringBuilder temp = new StringBuilder();
for(int j=0; j<n; j++){
if(j==colForRow[i]){
temp.append("Q");
}else{
temp.append(".");
}
}
item.add(temp.toString());
}
res.add(item);
return;
}
for(int i=0; i<n; i++){
colForRow[rows] = i;
if(check(rows,colForRow)){
NQueensCore(n,rows+1,colForRow);
}
}
}
public boolean check(int rows,int[] colForRow){
for(int i=0; i<rows; i++){
if(colForRow[rows]==colForRow[i] || Math.abs(colForRow[rows]-colForRow[i])==rows-i){
return false;
}
}
return true;
}
}
题目2的链接
class Solution {
int count = 0;
public int totalNQueens(int n) {
if(n<=0) return 0;
NQueenCore(n,0,new int[n]);
return count;
}
public void NQueenCore(int n, int rows, int[] colForRow){
if(rows==n){
count++;
return;
}
for(int i=0; i<n; i++){
colForRow[rows] = i;
if(check(rows,colForRow)){
NQueenCore(n,rows+1,colForRow);
}
}
}
public boolean check(int rows, int[] colForRow){
for(int i=0; i<rows; i++){
if(colForRow[rows]==colForRow[i] || Math.abs(colForRow[rows]-colForRow[i])==rows-i){
return false;
}
}
return true;
}
}
这两道题目和Combination Sum、Permutations的思路一致,这种题目都是使用这个套路,就是用一个循环去枚举当前所有情况,然后把元素加入,递归,再把元素移除,这道题目中不用移除的原因是我们用一个一维数组去存皇后在对应行的哪一列,因为一行只能有一个皇后,如果二维数组,那么就需要把那一行那一列在递归结束后设回没有皇后,所以道理是一样的。