- 算法
回溯 - 核心思想
八皇后问题是回溯的经典问题。首先建议把模板备好,照着模板开始写。
List<Value> result;
void backtrack(路径,选择列表){
if(满足结束条件){
result.add(路径);
return;
}
for(选择:选择列表){
做选择;
backtrack(路径,选择列表);
撤销选择;
}
}
此外,对于使用java做这个道题,需要考虑java的字符处理太复杂了,建议先使用数组,然后进行转换。另外U1S1,笔试碰到这种题大概率要GG,实在太复杂了,我手撸不出来、
3. 代码
class Solution {
List<List<String>> res = new LinkedList<>();
public List<List<String>> solveNQueens(int n) {
int[][] li = new int[n][n];
backtrack(li,n,0);
return res;
}
void backtrack(int[][] li,int n,int i){
if(i == n){
res.add(change(li));
return;
}
for(int j = 0;j < n;++j){
if(judge(li,i,j,n) == true) li[i][j] = 1;
else{
li[i][j] = -1;
continue;
}
backtrack(li,n,i+1);
li[i][j] = -1;
}
}
boolean judge(int[][] li,int i,int j,int n){
for (int k = 0; k < i; k++) {
if(li[k][j] == 1) return false;
}
for (int k = 1; k < n; k++) {
if(i-k ==-1 || j-k ==-1) break;
if(li[i-k][j-k] == 1) return false;
}
for (int k = 1; k < n; k++) {
if(i-k ==-1 || j+k ==n) break;
if(li[i-k][j+k] == 1) return false;
}
return true;
}
List<String> change(int[][] temp){
List<String> res = new LinkedList<>();
for(int i =0;i< temp.length;i++){
String str = "";
for (int j = 0; j < temp[i].length; j++) {
if(temp[i][j] == 1){
str += "Q";
}else{
str +=".";
}
}
res.add(str);
}
return res;
}
}