题目描述:
代码如下:
class Solution {
List<List<String>> res=new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
char chessboard[][]=new char[n][n];
for(int i=0;i<n;i++){
Arrays.fill(chessboard[i],'.');
}
backtrack(0, chessboard);
return res;
}
public void backtrack(int row,char[][] chessboard){
if(chessboard.length==row){//算完所有行数的时候
res.add(toStringList(chessboard));
return ;
}
for(int col=0;col<chessboard[row].length;col++){//对应每一个列的选择
if(!isvalid(row,col,chessboard)){
continue;
}
//做出选择
chessboard[row][col]='Q';
//进入下一层决策树(下一行)
backtrack(row+1, chessboard);
//撤销选择
chessboard[row][col]='.';
}
}
private boolean isvalid(int row,int col,char [][]chess) {
//检查列中是否有冲突
for(int i=0;i<row;i++){
if(chess[i][col]=='Q'){
return false;//前面的列已经放置了皇后了
}
}
//检查左上方中是否有冲突
for(int i=row-1,j=col-1; i>=0&&j>=0;i--,j--){//不用判断当前行和当前列
if(chess[i][j]=='Q'){
return false;
}
}
//检查右上方中是否有冲突
for(int i=row-1,j=col+1;i>=0&&j<chess[row].length;i--,j++){
if(chess[i][j]=='Q'){
return false;
}
}
return true;
}
public List<String> toStringList(char chess[][]){
ArrayList<String> list = new ArrayList<>();
for(int i=0;i<chess.length;i++){
list.add(String.valueOf(chess[i]));
}
return list;
}
}