搜索专项——DFS

八皇后问题

https://www.luogu.org/recordnew/show/19470456

  1. 这个问题首先想到的是爆搜每个节点可能的情况,利用回溯进行寻找,,但这样的时间复杂度为 O ( 2 n ) O(2^n) 肯定指数爆炸
  2. 我们可以对于每层进行一次遍历
    恰好每行每列各放置一个皇后, 如果用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();
    }
}

猜你喜欢

转载自blog.csdn.net/baidu_41560343/article/details/90680955