八皇后问题
https://www.luogu.org/recordnew/show/19470456
- 这个问题首先想到的是爆搜每个节点可能的情况,利用回溯进行寻找,,但这样的时间复杂度为 肯定指数爆炸
- 我们可以对于每层进行一次遍历
恰好每行每列各放置一个皇后, 如果用C[x]表示第x行皇后的列编号, 则问题变成了全排列生成问题。而0~n的排列一共只有n! ,至少比指数小,。
import java.util.Scanner;
public class Main{
private int[] col = new int[20];
private boolean[][] use = new boolean[3][100];
private int size;
private int[] result = new int[20];
private int ans = 0;
public void get_data(){
Scanner in = new Scanner(System.in);
size= in.nextInt();
}
public void dfs(int i){
if(i==size+1) {
ans++;
if(ans<=3)
this.output();
return;
}
for(int j=1;j<=size;j++){
if(!use[0][j]&&!use[1][i+j]&&!use[2][i-j+size]) {
result[i] = j;
use[0][j] = use[1][i+j] = use[2][i-j+size] = true;
dfs(i+1);
use[0][j] = use[1][i+j] = use[2][i-j+size] = false;
}
}
}
public void solve(){
dfs(1);
System.out.println(ans);
}
public void output(){
for(int i=1;i<=size;i++){
System.out.print(result[i]+" ");
}
System.out.println();
}
public static void main(String arg[]){
Main obj = new Main();
obj.get_data();
obj.solve();
}
}