The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[“.Q..”, // Solution 1
“…Q”,
“Q…”,
“..Q.”],
[“..Q.”, // Solution 2
“Q…”,
“…Q”,
“.Q..”]
]
public class Solution {
public List<String[]> list;
public List<String[]> solveNQueens(int n) {
int [] queenList = new int[n];
list = new ArrayList<String[]>();
placeQueen(0,queenList);
return list;
}
boolean isSafe(int col,int row,int[] queenList){
int tmpRow = 0;
for(int tmpCol = 0; tmpCol < col; tmpCol++){
tmpRow = queenList[tmpCol];
if(tmpRow == row|| tmpRow+tmpCol == row+col||tmpRow-tmpCol==row-col){
return false;
}
}
return true;
}
boolean placeQueen(int col,int[] queenList){
boolean isFind = false;
int n = queenList.length;
if(col == n){
// isFind = true; //不设结束条件,继续回溯
String[] s = convert(queenList);
list.add(s);
}
else{
int row = 0;
while(row < n&&!isFind){
if(isSafe(col,row,queenList)){
queenList[col] = row;
isFind = placeQueen(col+1,queenList);
// if(!isFind){
// row++;
// }
row++;
}
else{
row++;
}
}
}
return isFind;
}
String [] convert(int [] queenList){
int n = queenList.length;
String [] str = new String[n];
char [] ch = new char [n];
Arrays.fill(ch,'.');
int k = 0;
for(int i = 0; i <n;i++){
k = queenList[i];
ch[k] ='Q';
str[i] = new String(ch);
ch[k] ='.';
}
return str;
}
}