数据结构:回溯--解决八皇后问题

 


public class Queue8 {

    int max = 8;
    int count = 1;
    // 定义数组,保存皇后放置位置的结果,比如arr = {0,4,7,5,2,6,1,3}
    int[] arr = new int[max];
    public static void main(String[] args) {
        Queue8 queue8 = new Queue8();

        for(int i=0; i<queue8.max; i++) {
            queue8.arr[0] = i;
            queue8.check(1);
        }
    }

    private void check(int n){
        if(n == max){
            print();
            count++;
            return;
        }

        // 依次放入皇后,并判断是否冲突
        for(int i=0; i<max; i++){
            arr[n] = i;
            if(judge(n)){ // 不冲突
                check(n+1);
            }
        }
    }

    // 当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突
    private boolean judge(int n){
        for (int i = 0; i < n; i++) {
            // arr[i] == arr[n]表示在同一列,  Math.abs(n-i) == Math.abs(arr[n]-arr[i]))表示同一斜线
            if(arr[i] == arr[n] || (Math.abs(n-i) == Math.abs(arr[n]-arr[i]))){
                return false;
            }
        }

        return true;
    }

    private void print(){
        System.out.printf("count="+count +"  ");
        for (int i = 0; i < 8; i++) {
            //System.out.print("count="+count + " "+arr[i] + " ");
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}
发布了557 篇原创文章 · 获赞 40 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/103739719