使用遞歸回溯算法解決八皇后問(wèn)題

什么是八皇后問(wèn)題

八皇后問(wèn)題廊营,是一個(gè)古老而著名的問(wèn)題哼凯,是回溯算法的典型案例锌妻。該問(wèn)題是國(guó)際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國(guó)際象棋上擺放八個(gè)皇后盈包,使其不能互相攻擊沸呐,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上呢燥,問(wèn)有多少種擺法崭添。

代碼實(shí)現(xiàn)

package com.swh.data.recursion;

import com.alibaba.fastjson.JSON;

public class Queue8 {
    /**
     *  表示存放的皇后  數(shù)組元素的下標(biāo)表示存放的第幾個(gè)皇后也是第幾行皇后
     *  數(shù)組元素中的值表示 皇后存放的第幾列
     */
    int max = 8;
    private int[] arrays = new int[max];
    static int count = 0;

    public static void main(String[] args) {
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.printf("一共有%d種排列方法",count);
    }

    /**
     * n  表示第幾個(gè)房后
     *
     * @param n
     */
    private void check(int n) {
        if (n == max) { //n == 8 表示已經(jīng)開(kāi)始放第九個(gè)皇后(n 從0開(kāi)始)  說(shuō)明前八個(gè)已經(jīng)放好  也就是說(shuō)當(dāng)前這種放置方式已經(jīng)完成
            print();
            return;
        }

        for (int i = 0; i < max; i++) {
            arrays[n] = i; // 把當(dāng)前的列設(shè)置到數(shù)組中
            // 檢查放入的皇后是否與其他皇后沖突
            if(!judge(n)){
                check(n+1);
            }
        }

    }

    /**
     *  n 表示第幾個(gè)皇后
     *  該方法用于判斷當(dāng)前第n個(gè)皇后 是否與前面幾個(gè)皇后有沖突
     *
     * @param n
     * @return
     */
    private boolean judge(int n) {

        for (int i=0;i<n;i++){

            /**
             * 判斷第n個(gè)皇后是否跟之前的有沖突
             * arrays[i]==arrays[n] 表示是否在同一列
             * Math.abs(n-i)==Math.abs(arrays[n]-arrays[i])
             *     表示是否在同一斜線上 Math.abs(n-i)  這個(gè)表示行的差距
             *     Math.abs(arrays[n]-arrays[i]) 這個(gè)表示列的差距
             *     當(dāng)行的差距跟列的差距一致時(shí),說(shuō)明在同一個(gè)斜線上
             * 至于行  因?yàn)?n表示也同時(shí)表示第幾行的皇后  她與前面幾行的皇后進(jìn)行比較 肯定不會(huì)重復(fù)
             *
             */
            if(arrays[i]==arrays[n]||Math.abs(n-i)==Math.abs(arrays[n]-arrays[i])){
                return true;
            }


        }
        return false;
    }

    private void print() {
        count++;
        System.out.println(JSON.toJSONString(arrays));
    }


}

執(zhí)行結(jié)果

[0,4,7,5,2,6,1,3]
[0,5,7,2,6,3,1,4]
[0,6,3,5,7,1,4,2]
[0,6,4,7,1,3,5,2]
[1,3,5,7,2,0,6,4]
[1,4,6,0,2,7,5,3]
[1,4,6,3,0,7,5,2]
[1,5,0,6,3,7,2,4]
[1,5,7,2,0,3,6,4]
[1,6,2,5,7,4,0,3]
[1,6,4,7,0,3,5,2]
[1,7,5,0,2,4,6,3]
[2,0,6,4,7,1,3,5]
[2,4,1,7,0,6,3,5]
[2,4,1,7,5,3,6,0]
[2,4,6,0,3,1,7,5]
[2,4,7,3,0,6,1,5]
[2,5,1,4,7,0,6,3]
[2,5,1,6,0,3,7,4]
[2,5,1,6,4,0,7,3]
[2,5,3,0,7,4,6,1]
[2,5,3,1,7,4,6,0]
[2,5,7,0,3,6,4,1]
[2,5,7,0,4,6,1,3]
[2,5,7,1,3,0,6,4]
[2,6,1,7,4,0,3,5]
[2,6,1,7,5,3,0,4]
[2,7,3,6,0,5,1,4]
[3,0,4,7,1,6,2,5]
[3,0,4,7,5,2,6,1]
[3,1,4,7,5,0,2,6]
[3,1,6,2,5,7,0,4]
[3,1,6,2,5,7,4,0]
[3,1,6,4,0,7,5,2]
[3,1,7,4,6,0,2,5]
[3,1,7,5,0,2,4,6]
[3,5,0,4,1,7,2,6]
[3,5,7,1,6,0,2,4]
[3,5,7,2,0,6,4,1]
[3,6,0,7,4,1,5,2]
[3,6,2,7,1,4,0,5]
[3,6,4,1,5,0,2,7]
[3,6,4,2,0,5,7,1]
[3,7,0,2,5,1,6,4]
[3,7,0,4,6,1,5,2]
[3,7,4,2,0,6,1,5]
[4,0,3,5,7,1,6,2]
[4,0,7,3,1,6,2,5]
[4,0,7,5,2,6,1,3]
[4,1,3,5,7,2,0,6]
[4,1,3,6,2,7,5,0]
[4,1,5,0,6,3,7,2]
[4,1,7,0,3,6,2,5]
[4,2,0,5,7,1,3,6]
[4,2,0,6,1,7,5,3]
[4,2,7,3,6,0,5,1]
[4,6,0,2,7,5,3,1]
[4,6,0,3,1,7,5,2]
[4,6,1,3,7,0,2,5]
[4,6,1,5,2,0,3,7]
[4,6,1,5,2,0,7,3]
[4,6,3,0,2,7,5,1]
[4,7,3,0,2,5,1,6]
[4,7,3,0,6,1,5,2]
[5,0,4,1,7,2,6,3]
[5,1,6,0,2,4,7,3]
[5,1,6,0,3,7,4,2]
[5,2,0,6,4,7,1,3]
[5,2,0,7,3,1,6,4]
[5,2,0,7,4,1,3,6]
[5,2,4,6,0,3,1,7]
[5,2,4,7,0,3,1,6]
[5,2,6,1,3,7,0,4]
[5,2,6,1,7,4,0,3]
[5,2,6,3,0,7,1,4]
[5,3,0,4,7,1,6,2]
[5,3,1,7,4,6,0,2]
[5,3,6,0,2,4,1,7]
[5,3,6,0,7,1,4,2]
[5,7,1,3,0,6,4,2]
[6,0,2,7,5,3,1,4]
[6,1,3,0,7,4,2,5]
[6,1,5,2,0,3,7,4]
[6,2,0,5,7,4,1,3]
[6,2,7,1,4,0,5,3]
[6,3,1,4,7,0,2,5]
[6,3,1,7,5,0,2,4]
[6,4,2,0,5,7,1,3]
[7,1,3,0,6,4,2,5]
[7,1,4,2,0,6,3,5]
[7,2,0,5,1,4,6,3]
[7,3,0,2,5,1,6,4]
一共有92種排列方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叛氨,一起剝皮案震驚了整個(gè)濱河市呼渣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寞埠,老刑警劉巖屁置,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仁连,居然都是意外死亡蓝角,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)饭冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)使鹅,“玉大人,你說(shuō)我怎么就攤上這事昌抠』贾欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵扰魂,是天一觀的道長(zhǎng)麦乞。 經(jīng)常有香客問(wèn)我蕴茴,道長(zhǎng),這世上最難降的妖魔是什么姐直? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任倦淀,我火速辦了婚禮,結(jié)果婚禮上声畏,老公的妹妹穿的比我還像新娘撞叽。我一直安慰自己,他們只是感情好插龄,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布愿棋。 她就那樣靜靜地躺著,像睡著了一般均牢。 火紅的嫁衣襯著肌膚如雪糠雨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天徘跪,我揣著相機(jī)與錄音甘邀,去河邊找鬼。 笑死垮庐,一個(gè)胖子當(dāng)著我的面吹牛松邪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哨查,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逗抑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寒亥?” 一聲冷哼從身側(cè)響起邮府,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溉奕,沒(méi)想到半個(gè)月后挟纱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腐宋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年紊服,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胸竞。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欺嗤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卫枝,到底是詐尸還是另有隱情煎饼,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布校赤,位于F島的核電站吆玖,受9級(jí)特大地震影響筒溃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沾乘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一怜奖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翅阵,春花似錦歪玲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至讹语,卻和暖如春钙皮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽决。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工株灸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人擎值。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逐抑,于是被迫代替她去往敵國(guó)和親鸠儿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容