java解八皇后問題

八皇后問題,一個古老而著名的問題,是回溯算法的典型案例。該問題由國際西洋棋棋手馬克斯·貝瑟爾於 1848 年提出:在 8×8 格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認爲有 76 種方案。1854 年在柏林的象棋雜誌上不同的作者發表了 40 種不同的解,後來有人用圖論的方法解出 92 種結果。計算機發明後,有多種計算機語言可以編程解決此問題。------from百度百科

public class Queen8 {
    int count = 0;      //記錄有幾種解法
    int max = 8;        //設定爲8x8的棋盤
    int[] array = new int[max];


    public static void main(String[] args) {
        Queen8 q = new Queen8();
        q.check(0);
        System.out.println("total:" + q.count);
    }

    //主要計算函數,計算第n行放置情況
    private void check(int n){
        if(n == max){
            print();
            return;
        }
        //進行放置
        for(int i=0; i<max; i++){
            array[n] = i;
            if(isOK(n)){
                check(n+1);     //繼續放下一行
            } else {
                continue;           //嘗試新的位置
            }
        }
    }

    //判斷第n行的放置情況是否可行
    private boolean isOK(int n){
        for(int i=0; i<n; i++){
            //如果列相同或者組成斜率爲1則不合法
            if(array[n]==array[i] || Math.abs(n-i)==Math.abs(array[n]-array[i])){
                return false;
            }
        }
        return true;
    }

    //打印數組
    private void print(){
        count++;        //解法數量加一
        for(int i=0; i<max; i++){
            System.out.print(array[i]);
            if(i != max-1){
                System.out.print(" ");
            }
        }
        System.out.println();
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章