思路代码:
import java.util.Scanner;
public class Main {
//定义一个max表示一共有多少个皇后。
Scanner input = new Scanner(System.in);
int max = input.nextInt();
// 定义一个数组就可以了,下标为第i个皇后,即第i行。值为对应的第几列。
int[] array = new int[max];
// 统计一共有多少种方法,打印一次即count++
static int count = 0;
public static void main(String[] args) {
Main queen8 = new Main();
queen8.check(0);
System.out.println(count);
}
public void check(int n) {
//n从0开始,当n==max的时候,说明所有皇后的位置摆放好了。
if (n == max) {
count++;
if (count<4){
printf();
}
return;
}
for (int i = 0; i < max; i++) {
array[n] = i;
//判断第n个皇后的摆放位置是否满足要求,如果满足则递归下去摆放下一个皇后。
//!!这样打印的不止是一种摆放,
//当最后一个位置摆放可以的时候,就打印,然后接着未结束的for循环。
// 然后返回到上一层,接着上一层未结束的for循环。单纯判断是否冲突就得1.5万多次了。
if (judge(n)) {
check(n + 1);
}
}
}
//判断放的位置是否满足,即不同列、不同斜线上。
//不需要考虑同一行的情况,因为我们下标 i 就代表了行。
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
// 同一斜线上,即正方形的对角线,也可理解为斜率为+-1;即 a行-b行==a列-b列 (绝对值)
if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
return false;
}
}
return true;
}
//打印
public void printf() {
for (int i = 0; i < max; i++) {
System.out.print(array[i] + 1 + " ");
}
System.out.println();
}
}
如果复制代码过去发现最后一个样例超时的时候,多提交几次就好了,哈哈哈哈。(有疑问或更好的思路,欢迎评论区探讨)。