import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] x = new int[n]; // 定义棋盘
boolean t = nqueenBruteForce(n, 0, x);
if(!t){
System.out.println("No solution");
}
}
private static boolean nqueenBruteForce(int n, int k, int[] x) {
/**
* 在前k-1行已放置k-1个皇后的情况下,求n皇后
* 的所有解并输出,有解则返回true,否则返回false
*/
boolean t = false; // 用t表示是否有解
for(int i=1; i<=n; i++){
x[k] = i; // 尝试将第k行的皇后放置在第i列的位置
if(k==n-1){ // 找到一个n皇后的排列方式
if(place(n, x)){ // 这n个皇后不冲突
t = true;
for(int h=0; h<x.length; h++){ // 输出当前找到的解
System.out.print(x[h]);
}
System.out.println();
}
}else {
// x[1...k]只是皇后的部分排列
boolean t1 = nqueenBruteForce(n, k+1, x); // 递归
if(t1){
t = true;
}
}
}
return t;
}
private static boolean place(int n, int[] x) {
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(x[i]==x[j] || i-x[i]==j-x[j] || i+x[i]==j+x[j]){
return false;
}
}
}
return true;
}
}
存在问题:
- 很多状态实际上没必要枚举
- 能够运行出结果的n很小,即时间复杂度太大,Θ(n!)