题目出处 代码里有解释(深搜): package search; import java.util.Scanner; public class P1219 { static int n, sum = 0;// sum记录输出次数 static int[] arr;// 用一维数组表示皇后的位置,下标代表行,值代表列 public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); arr = new int[n]; dfs(0); System.out.println(sum);// 最后记得输出m } public static void dfs(int now) { if (now == n) { if (sum < 3) { print(); } sum++;// 没输出一次就++ return; } for (int i = 0; i < n; i++) { arr[now] = i;// 先把当前now位置的值置为1,代表第now行第1列 boolean ok = false;//初始值设为不和前面的冲突 for (int j = 0; j < now; j++) { // 列的位置相等 或 在同一斜线上都是冲突 //其实可以用下面这个式子这个判断对角线是否冲突,但是会最后一个测试点TLE,可能调方法也蛮耗时间 //Math.abs(j - now) == Math.abs(arr[j] - arr[now]) //我们把上面这个式子用不调方法的方式写出来就不会TLE了,就很奇怪 if (arr[j] == arr[now] || now - j == arr[now] - arr[j] || j -now == arr[now] - arr[j]) { ok = true; break; } } if (!ok) {//不冲突就继续放下一行 dfs(now+1); } // 冲突的话继续把该皇后放在下一列 } } public static void print() { for (int i = 0; i < n; i++) { System.out.print(arr[i] + 1 + " ");// 根据题目要求应该+1 } System.out.println(); } }