输出解的个数
private int count = 0;
public int totalNQueens(int n) {
int[] placed = new int[n];//数组下标表示第i个皇后,值为皇后放置的纵坐标
dfs(placed, 0);
return count;
}
public void dfs(int[] placed, int row) {
if (row == placed.length) {
count++;
return;
}
for (int j = 0; j < placed.length; j++) {
placed[row] = j;
if (isValid(placed, row)) {
dfs(placed, row + 1);
}
}
}
public boolean isValid(int[] placed, int i) {
for (int j = 0; j < i; j++) {
if (placed[i] == placed[j] || Math.abs(i - j) == Math.abs(placed[i] - placed[j])) {
return false;
}
}
return true;
}
输出放置结果
与上题基本一样,只是得到解后构造结果
public List<List<String>> solveNQueens(int n) {
int[] placed = new int[n];//数组下标表示第i个皇后,值为皇后放置的纵坐标
List<List<String>> ans=new ArrayList<>();
dfs(placed, 0,ans);
return ans;
}
public void dfs(int[] placed, int row,List<List<String>> ans) {
if (row == placed.length) {
List<String> list=new ArrayList<>();
for (int value : placed) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < value; j++) {
sb.append(".");
}
sb.append("Q");
for (int j = value + 1; j < placed.length; j++) {
sb.append(".");
}
list.add(sb.toString());
}
ans.add(list);
return;
}
for (int j = 0; j < placed.length; j++) {
placed[row] = j;
if (isValid(placed, row)) {
dfs(placed, row + 1,ans);
}
}
}
public boolean isValid(int[] placed, int i) {
for (int j = 0; j < i; j++) {
if (placed[i] == placed[j] || Math.abs(i - j) == Math.abs(placed[i] - placed[j])) {
return false;
}
}
return true;
}