思路:回溯
不能同行;不能同列;不能同斜线
row 相当于 index,每一行在 for 里遍历每一列,检查当前位置是否合理,然后正常的回溯步骤
class Solution {
char[][] chessboard;
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
chessboard = new char[n][n];
for (char[] c : chessboard) {
Arrays.fill(c, '.');
}
dfs(n,0);
return res;
}
public void dfs(int n,int row){//row记录遍历到第几行了
if(row==n){
List<String> temp = new ArrayList<>();
for (char[] c : chessboard) {
temp.add(String.copyValueOf(c));
}
res.add(temp);
return;
}
for(int col=0;col<n;col++){
if(isVaild(row,col,n)){//检查当前位置的 列、斜 有无Q
chessboard[row][col] = 'Q';
dfs(n, row+1);
chessboard[row][col] = '.';
}
}
}
public boolean isVaild(int row,int col,int n){
// 检查列
for (int i=0; i<row; i++) { // 相当于剪枝
if (chessboard[i][col] == 'Q') {
return false;
}
}
// 检查左上对角线
for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
// 检查右上对角线
for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
return true;
}
}