51. N 皇后
回溯:
java
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> ans = new ArrayList<>();
//每一行的queen在哪一列
int[] queens = new int[n];
//每一列有没有重复
boolean[] col = new boolean[n];
//主对角线有没有重复
boolean[] dig1 = new boolean[2*n-1];
//副对角线有没有重复
boolean[] dig2 = new boolean[2*n-1];
dfs(0,queens,col,dig1,dig2,ans);
return ans;
}
private void dfs(int r,int[] queens,boolean[] col,boolean[] dig1,boolean[] dig2,List<List<String>> ans){
int n = col.length;
if(r == n){
List<String> partAns = new ArrayList<>();
for(int i:queens){
char[] partAns1 = new char[n];
Arrays.fill(partAns1,'.');
partAns1[i] = 'Q';
partAns.add(new String(partAns1));
}
ans.add(partAns);
return;
}
//对列遍历
for(int c = 0;c<n;c++){
//对副对角线的规律加上n-1这样符合下标规律
int rc = r-c + n-1;
if(!col[c] && !dig1[r+c] && !dig2[rc]){
queens[r] = c;
col[c] = dig1[r+c] = dig2[rc] = true;
//递归
dfs(r+1,queens,col,dig1,dig2,ans);
//恢复现场
col[c] = dig1[r+c] = dig2[rc] = false;
}
}
}
}
时间复杂度:O(N^2 * N!)
空间复杂度:O(N)