问题描述
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/edb580f1e8718a2a5631582dbad20c01.png)
问题分析
经验教训
代码实现
int count = 0;
public int totalNQueens(int n) {
if (n <= 0) {
return 0;
}
boolean[] d1 = new boolean[2 * n - 1];
boolean[] d2 = new boolean[2 * n - 1];
boolean[] colVisited = new boolean[n];
findQueens(n, 0, colVisited, d1, d2);
return count;
}
public void findQueens(int n, int row, boolean[] colVisited, boolean[] d1, boolean[] d2) {
if (row == n) {
++count;
return;
}
for (int j = 0; j < n; j++) {
if (colVisited[j] || d1[row + j] || d2[row - j + n - 1]) {
continue;
}
colVisited[j] = true;
d1[row + j] = true;
d2[row - j + n - 1] = true;
findQueens(n, row + 1, colVisited, d1, d2);
colVisited[j] = false;
d1[row + j] = false;
d2[row - j + n - 1] = false;
}
return;
}
public int totalNQueens(int n) {
if (n <= 0) {
return 0;
}
boolean[] d1 = new boolean[2 * n - 1];
boolean[] d2 = new boolean[2 * n - 1];
boolean[] colVisited = new boolean[n];
int[] count = new int[1];
findQueens(n, 0, colVisited, d1, d2, count);
return count[0];
}
public void findQueens(int n, int row, boolean[] colVisited, boolean[] d1, boolean[] d2, int[] count) {
if (row == n) {
++count[0];
return;
}
for (int j = 0; j < n; j++) {
if (colVisited[j] || d1[row + j] || d2[row - j + n - 1]) {
continue;
}
colVisited[j] = true;
d1[row + j] = true;
d2[row - j + n - 1] = true;
findQueens(n, row + 1, colVisited, d1, d2, count);
colVisited[j] = false;
d1[row + j] = false;
d2[row - j + n - 1] = false;
}
return;
}
public int totalNQueens(int n) {
if (n <= 0) {
return 0;
}
boolean[] d1 = new boolean[2 * n - 1];
boolean[] d2 = new boolean[2 * n - 1];
boolean[] colVisited = new boolean[n];
int res = findQueens(n, 0, colVisited, d1, d2);
return res;
}
public int findQueens(int n, int row, boolean[] colVisited, boolean[] d1, boolean[] d2) {
if (row == n) {
return 1;
}
int res = 0;
for (int j = 0; j < n; j++) {
if (colVisited[j] || d1[row + j] || d2[row - j + n - 1]) {
continue;
}
colVisited[j] = true;
d1[row + j] = true;
d2[row - j + n - 1] = true;
res += findQueens(n, row + 1, colVisited, d1, d2);
colVisited[j] = false;
d1[row + j] = false;
d2[row - j + n - 1] = false;
}
return res;
}