import java.util.Scanner; public class Main { static int n; //棋盘大小 static int ans; //解的个数 static boolean[] a = new boolean[20]; // 列占用情况,若第 i 列被占用,则 a[i] = true,否则为 false static boolean[] x1 = new boolean[20]; // 左下-右上 对角线的占用情况 static boolean[] y1 = new boolean[20]; // 左上-右下 对角线的占用情况 private static void dfs(int deep) { // deep 表示当前搜索到第几行 if (deep >= n) { // 搜索完最后一行,说明找到了一组合法解 ans++; return; // 回溯 } for (int i = 0; i < n; i++) { // 枚举当前行的皇后放置到第 i 列 if (x1[i + deep] == false && y1[i - deep + n] == false && a[i] == false) { // 判断该皇后是否与已放置的皇后发生冲突 // 放置皇后 (deep, i),一共需要修改三个标记数组 x1[deep + i] = true; y1[i - deep + n] = true; a[i] = true; dfs(deep + 1); // 当前行枚举完毕,搜索下一行 // 恢复放置皇后 (deep, i) 前的状态 a[i] = false; x1[deep + i]=false; y1[i - deep + n] = false; } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); dfs(0); System.out.println(ans); } }
注:同一斜线上的(x1, y1), (x2, y2)满足条件:|x2 - x1| = |y2 - y1|,左下到右上这半部分满足同和规律,且和为1 - 6, 左上到右下满足同差规律, 且差加上n为1 - 7。(当n = 4时)