这道题目
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<>();
if(n <=0) return res;
helper(res,new int[n],0);
return res;
}
/**
* queues数组是精髓 用数组的下标及值进行皇后位置的说明
* 如: [1,1,0,2] 0下标表示的是第0+1行的皇后放在第1列上
* .Q...
* pos : 行,从第0行开始
*
* [".Q..",
"...Q",
"Q...",
"..Q."],
进入递归,pos为 + 1时 第二个递归来到for循环 i= 0赋给queues[pos] 就意味着将第二行的Q放在第1列 进入isValid方法
结果就返回false
*/
private void helper(List<List<String>> res, int[] queues, int pos) {
if(pos == queues.length){
addSolution(res,queues);
return;
}
for(int i = 0; i< queues.length;i++){
queues[pos] = i;
if(isValid(queues,pos)){
helper(res,queues,pos+1);
}
}
}
/**
* queues:[0,1,0,0]
* [".Q..",
"...Q", [0,1,0,0] pos = 1 queues[0]-queues[1] = i -pos
"Q...",
"..Q."],
*
* i < pos
*/
private boolean isValid(int[] queues, int pos) {
for(int i = 0; i< pos; i++){
// 为同一列
if(queues[i] == queues[pos]){
return false;
// 在对角线上
}else if(Math.abs(queues[pos] - queues[i]) == Math.abs(i - pos)){
return false;
}
}
return true;
}
private void addSolution(List<List<String>> res, int[] queues) {
List<String> list = new ArrayList<>();
for(int i = 0; i< queues.length; i++){
StringBuilder sb = new StringBuilder();
for(int j = 0; j < queues.length;j++){
if(queues[i] == j){
sb.append('Q');
}else {
sb.append('.');
}
}
list.add(sb.toString());
}
res.add(list);
}