八皇后問題

八皇后問題性锭,是一個古老而著名的問題赠潦,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國際象棋上擺放八個皇后草冈,使其不能互相攻擊祭椰,即任意兩個皇后都不能處于同一行、同一列或同一斜線上疲陕,問有多少種擺法。 高斯認為有76種方案钉赁。1854年在柏林的象棋雜志上不同的作者發(fā)表了40種不同的解蹄殃,后來有人用圖論的方法解出92種結果。計算機發(fā)明后你踩,有多種計算機語言可以解決此問題诅岩。

import java.util.ArrayDeque;

/**
 * 任意兩個皇后不能在同一行、同一列带膜、同一斜線上
 * Created by lenovo on 2018/7/28.
 */
public class Queen {

    static int n; // 皇后數量吩谦,即棋盤的 長寬

    static boolean[] visitedColumn;   // visitedColumn[0] = true, 表示第 0 列已被訪問過 , 保證各皇后不在同一列
    static int[] rowColumn; // rowColumn[i] = j  表示第 i 行的皇后在第 j 列

    static int count = 0;
    static ArrayDeque<String> stack = new ArrayDeque<>();


    static boolean dfs(int x) {
        // x 表示 第 x 行
        if (x == n) return true;

        for (int y = 0; y < n; y++) {
            // y 代表 第 y 列膝藕,對第 y 列 進行試探
            if (visitedColumn[y] == false && isNotDuijiao(x, y)) {
                // 未訪問過的列 & 列 != 已經放置的皇后的斜線上, 滿足條件

                visitedColumn[y] = true;
                rowColumn[x] = y;
                stack.push("(" + x + "," + y + ")");


                if (dfs(x + 1)) {
                    // 遞歸試探下一行, 如果最終返回 true 式廷,表示得到正確結果,逆向打印棧中路徑
                    printStack();
                    count++;
                }

                //  回退
                visitedColumn[y] = false;
                stack.pop();

            }
            // 繼續(xù)試探下一列
        }
        // 執(zhí)行到這一步芭挽,表示 第 x 行所有的列試探結束滑废,返回false
        return false;
    }

    /**
     * 判斷試探的坐標 x,y 和 x 行之前排布的皇后是否成對角線
     *
     * @param x
     * @param y
     * @return
     */
    private static boolean isNotDuijiao(int x, int y) {
        int j = 0;
        for (int i = 0; i < x; i++) {
            j = rowColumn[i];
            if (x - i == y - j || (x - i + y - j) == 0) return false; // 是對角線,返回 false
        }
        return true;
    }

    // 雙棧打印路徑
    private static void printStack() {
        ArrayDeque<String> tempStack = new ArrayDeque<>();
        while (!stack.isEmpty()) {
            tempStack.push(stack.pop());
        }
        while (!tempStack.isEmpty()) {
            String pop = tempStack.pop();
            System.out.print(pop + "——>");
            stack.push(pop);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        n = 8;
        visitedColumn = new boolean[n];
        rowColumn = new int[n];
        for (int i = 0; i < n; i++) {
            visitedColumn[i] = false;
        }

        dfs(0);
        System.out.println(count);
    }
}

輸出

(0,6)——>(1,1)——>(2,5)——>(3,2)——>(4,0)——>(5,3)——>(6,7)——>(7,4)——>
(0,6)——>(1,2)——>(2,0)——>(3,5)——>(4,7)——>(5,4)——>(6,1)——>(7,3)——>
(0,6)——>(1,2)——>(2,7)——>(3,1)——>(4,4)——>(5,0)——>(6,5)——>(7,3)——>
(0,6)——>(1,3)——>(2,1)——>(3,4)——>(4,7)——>(5,0)——>(6,2)——>(7,5)——>
(0,6)——>(1,3)——>(2,1)——>(3,7)——>(4,5)——>(5,0)——>(6,2)——>(7,4)——>
(0,6)——>(1,4)——>(2,2)——>(3,0)——>(4,5)——>(5,7)——>(6,1)——>(7,3)——>
(0,7)——>(1,1)——>(2,3)——>(3,0)——>(4,6)——>(5,4)——>(6,2)——>(7,5)——>
(0,7)——>(1,1)——>(2,4)——>(3,2)——>(4,0)——>(5,6)——>(6,3)——>(7,5)——>
(0,7)——>(1,2)——>(2,0)——>(3,5)——>(4,1)——>(5,4)——>(6,6)——>(7,3)——>
(0,7)——>(1,3)——>(2,0)——>(3,2)——>(4,5)——>(5,1)——>(6,6)——>(7,4)——>
92
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末袜爪,一起剝皮案震驚了整個濱河市蠕趁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辛馆,老刑警劉巖俺陋,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡腊状,警方通過查閱死者的電腦和手機诱咏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寿酌,“玉大人胰苏,你說我怎么就攤上這事〈继郏” “怎么了硕并?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秧荆。 經常有香客問我倔毙,道長,這世上最難降的妖魔是什么乙濒? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任陕赃,我火速辦了婚禮,結果婚禮上颁股,老公的妹妹穿的比我還像新娘么库。我一直安慰自己,他們只是感情好甘有,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布诉儒。 她就那樣靜靜地躺著,像睡著了一般亏掀。 火紅的嫁衣襯著肌膚如雪忱反。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天滤愕,我揣著相機與錄音温算,去河邊找鬼。 笑死间影,一個胖子當著我的面吹牛注竿,可吹牛的內容都是我干的。 我是一名探鬼主播魂贬,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蔓搞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了随橘?” 一聲冷哼從身側響起喂分,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎机蔗,沒想到半個月后蒲祈,有當地人在樹林里發(fā)現(xiàn)了一具尸體甘萧,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年梆掸,在試婚紗的時候發(fā)現(xiàn)自己被綠了扬卷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡酸钦,死狀恐怖怪得,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情卑硫,我是刑警寧澤徒恋,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站欢伏,受9級特大地震影響入挣,放射性物質發(fā)生泄漏。R本人自食惡果不足惜硝拧,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一径筏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧障陶,春花似錦滋恬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媳维,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遏暴,已是汗流浹背侄刽。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朋凉,地道東北人州丹。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像杂彭,于是被迫代替她去往敵國和親墓毒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355