思想:跟解数独那题很像,同样都是先枚举每一行的情况,如果能枚举到第n行,表示有解
只不过数独是保证每一行,每一列,每一个Box中元素唯一;
这里的N皇后是保证每一行,每一列,每一个条斜线上(主对角线和次对角线)只有一个Q
class Solution {
List<List<String>> res = new ArrayList<>();
public boolean validate(char[][]board,int row,int col){//判断每一行,每一列,每一个斜线上是否只有一个Q
if(board[row][col]=='Q')return false;
int n = board.length;
for(int k=0;k<n;k++){//判断每一行,每一列上是否只有1个Q
if(board[row][k]=='Q')return false;
if(board[k][col]=='Q')return false;
}
for(int r=row,c=col;r>=0&&c>=0;r--,c--){//判断该元素所在的主对角线上中该元素左上方的位置上是否没有Q
if(board[r][c]=='Q')return false;
}
for(int r=row,c=col;r>=0&&c<n;r--,c++){//判断该元素所在的次对角线上该元素的右上方的位置上是否没有Q
if(board[r][c]=='Q')return false;
}
return true;
}
public void helper(char[][]board,int row,List<String>trace){
int n = board.length;
if(row==n){
res.add(new ArrayList<String>(trace));
return;
}
for(int col=0;col<n;col++){
if(validate(board,row,col)){
board[row][col] = 'Q';
trace.add(new String(board[row]));
helper(board,row+1,trace);
board[row][col] = '.';
trace.remove(trace.size()-1);
}
}
}
public List<List<String>> solveNQueens(int n) {
if(n<=0) return res;
char[][]board = new char[n][n];//生成n*n的棋盘
for(int i=0;i<n;i++){
Arrays.fill(board[i],'.');
}
helper(board,0,new ArrayList<String>());
return res;
}
}
N皇后变形-||:仅求所有的解的个数
class Solution {
int res = 0;
public boolean validate(char[][]board,int row,int col){//判断每一行,每一列,每一个斜线上是否只有一个Q
if(board[row][col]=='Q')return false;
int n = board.length;
for(int k=0;k<n;k++){//判断每一行,每一列上是否只有1个Q
if(board[row][k]=='Q')return false;
if(board[k][col]=='Q')return false;
}
for(int r=row,c=col;r>=0&&c>=0;r--,c--){//判断该元素所在的主对角线上中该元素左上方的位置上是否没有Q
if(board[r][c]=='Q')return false;
}
for(int r=row,c=col;r>=0&&c<n;r--,c++){//判断该元素所在的次对角线上该元素的右上方的位置上是否没有Q
if(board[r][c]=='Q')return false;
}
return true;
}
public void helper(char[][]board,int row){
int n = board.length;
if(row==n){
res++;
return;
}
for(int col=0;col<n;col++){
if(validate(board,row,col)){
board[row][col] = 'Q';
helper(board,row+1);
board[row][col] = '.';
}
}
}
public int totalNQueens(int n) {
if(n<=0) return res;
char[][]board = new char[n][n];//生成n*n的棋盘
for(int i=0;i<n;i++){
Arrays.fill(board[i],'.');
}
helper(board,0);
return res;
}
}