一开始创建一个二维数组,每当放上皇后,就变为true,
public class Solution {
List<List<String >> lists = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
boolean[][] map = new boolean[n][n];
int y=0;
List<String >list = new ArrayList<>();
if(n<=0){
lists.add(list);
}
if(n==1){
list.add("Q");
lists.add(list);
}
for (int x = 0;x<map.length;x++){
map[y][x] = true;
list.add(huahua(map,x,y));
dfs(map,y+1,list);
list.remove(huahua(map,x,y));
map[y][x] = false;
}
return lists;
}
private void dfs(boolean[][]map,int y,List<String >list){
for (int i=0;i<map.length;i++){
// System.out.println("i:"+i+"y:"+y);
if (isOk(map,i,y)){
map[y][i] = true;
String str = huahua(map,i,y);
list.add(str);
if (y==map.length-1){
lists.add(new ArrayList<>(list));
// System.out.println(list+"lllll");
list.remove(str);
map[y][i] = false;
return;
}
dfs(map,y+1,list);
list.remove(str);
map[y][i] = false;
}
}
}
//判断点是否可以
private boolean isOk(boolean[][]map,int x,int y){
// System.out.println("x:"+x+"y:"+y);
for(int i=0;i<map.length;i++){
if (map[i][x]&&i!=y){
// System.out.println("竖线出了问题");
return false;
}
}
for (int i=0;i<map[0].length;i++){
if (map[y][i]&&x!=i){
// System.out.println("横线出了问题");
return false;
}
}
for(int i=1;i<map.length;i++){
if((x+i<map[0].length)&&(y+i<map.length)&&map[y+i][x+i]){
// System.out.println(i);
// System.out.println("右下角");
return false;
}
if((x-i>=0)&&(y-i>=0)&&(map[y-i][x-i])){
// System.out.println("左上角");
return false;
}
if(y-i>=0&&x+i<map[0].length&&map[y-i][x+i]){
// System.out.println("右上角");
return false;
}
if(y+i<map.length&&x-i>=0&&map[y+i][x-i]){
// System.out.println("左下角");
return false;
}
}
return true;
}
//用来画出String
private String huahua(boolean[][]map,int x,int y){
StringBuilder stringBuilder = new StringBuilder();
for (int i=0;i<map[0].length;i++){
if (i!=x){
stringBuilder.append(".");
}else {
stringBuilder.append("Q");
}
}
return stringBuilder.toString();
}
}