设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。
示例:
输入:4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
解法1:经典递归回溯法
class Solution {
public List<List<String>> solveNQueens(int n) {
int[][] chess=new int[n][n];
int[][] flag=new int[3][2*n];
List<List<String>> result=new ArrayList<>();
this.placeQueen(0,result,chess,flag,n);
return result;
}
private void placeQueen(int row,List<List<String>> result,int[][] chess,int[][] flag,int n){
int nextRow=row+1;
if(row>=n){
// 生成方案
List<String> solution=new ArrayList<>();
for(int i=0;i<n;i++){
StringBuilder sb=new StringBuilder();
for(int j=0;j<n;j++){
if(chess[i][j]==0){
sb.append(".");
}else {
sb.append("Q");
}
}
solution.add(sb.toString());
}
result.add(solution);
}else{
for(int col=0;col<n;col++){
if(flag[0][col]!=1&&flag[1][row+col]!=1&&flag[2][n+row-col]!=1){
flag[0][col]=1;
flag[1][row+col]=1;
flag[2][n+row-col]=1;
chess[row][col]=1;
row++;
placeQueen(nextRow,result,chess,flag,n);
row--;
chess[row][col]=0;
flag[0][col]=0;
flag[1][row+col]=0;
flag[2][n+row-col]=0;
}
}
}
}
}