51. N皇后
题目链接
dfs
- 枚举每一行皇后摆放的列
- 使用boolean类型的数组来标记已摆放皇后所在的列、主对角线、副对角线
- 主对角线为行+列,副对角线为行-列
class Solution {
List<List<String>> ans = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
dfs(new int[n], n, 0, new boolean[n], new boolean[2*n-1], new boolean[2*n-1]);
return ans;
}
private void dfs(int[] row, int n, int i, boolean[] column, boolean[] diagonal1, boolean[] diagonal2){
if(i == n){
ans.add(print(row, n));
return;
}
for(int j = 0; j < n; j++){
if(column[j]) continue;
if(diagonal1[i+j]) continue;
if(diagonal2[i-j+n-1]) continue;
column[j] = true;
diagonal1[i+j] = true;
diagonal2[i-j+n-1] = true;
row[i] = j;
dfs(row, n, i+1, column, diagonal1, diagonal2);
column[j] = false;
diagonal1[i+j] = false;
diagonal2[i-j+n-1] = false;
}
}
private List<String> print(int[] row, int n){
List<String> list = new ArrayList<>();
for(int i = 0; i < n; i++){
char[] s = new char[n];
Arrays.fill(s, '.');
s[row[i]] = 'Q';
list.add(new String(s));
}
return list;
}
}