import java.util.Scanner;
public class NQueen {
public static int N; // 棋盘的大小
public static int ans = 0; // 答案
// dfs剪枝
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
int[] grid = new int[N]; // 下标行 值为列+1 0表示无皇后在该行
resolve(0, grid);
System.out.println(ans);
}
public static void resolve(int n, int[] grid) {
if (n == N) { // dfs遍历到底
//if (checkPattern(grid)) { // 不用在判断一遍 因为前N个都判断有效才能运行到这里
ans++; // 总共有多少个n皇后解法,结果++
printGrid(grid);
//}
return;
}
for (int m = 0; m < N; m++) {
if (checkAvailable(n, m, grid)) { // 检查在这里放置皇后是否合法
grid[n] = m + 1; // 试探
resolve(n + 1, grid);
grid[n] = 0; // 回溯
}
}
}
public static boolean checkAvailable(int n, int m, int[] grid) {
if (grid[n] != 0) { // 检测行是否有冲突
return false;
}
for (int i = 0; i < N; i++) {
int column = grid[i];
if (column != 0) {
if (grid[i] == m + 1) { // 列冲突
return false;
}
if (Math.abs(n - i) == Math.abs(m + 1 - column)) { // 斜向冲突
return false;
}
}
}
return true;
}
public static void printGrid(int[] grid) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (grid[i] - 1 != j) {
System.out.print("X ");
} else {
System.out.print("O ");
}
}
System.out.println();
}
System.out.println("---------------");
}
}
非最优化算法,仅供理解dfs。