資料結構 八皇后問題

2021-10-03 18:55:28 字數 1985 閱讀 7710

#include

int count =0;

/** * 八皇后問題

* @param row 表示起始行

* @param col 表示列數

* @param chess 指向每一行的指標

* @return

*/int

notdanger

(int row,

int j,

int(

*chess)[8

])}//判斷左上方

for(i = row, k = j; i >=

0&& k >=

0; i--

, k--)}

//判斷右下方

for(i = row, k = j; i <

8&& k <

8; i++

, k++)}

//判斷右上方

for(i = row, k = j; i >=

0&& k <

8; i--

, k++)}

//判斷右上方

for(i = row, k = j; i <

8&& k >=

0; i++

, k--)}

if(flag1 || flag2 || flag3 || flag4 || flag5)

else

}int

eightqueen

(int row,

int n,

int(

*chess)[8

])}if

(row ==8)

printf

("\n");

}printf

("\n");

count++;}

else

chess2[row]

[j]=1;

//在此處安放皇后

eightqueen

(row +

1, n, chess2);}

else}}

}int

main()

}//初始化棋盤

eightqueen(0

,8, chess)

;printf

("總共有%d中解決方法:\n"

, count)

;return0;

}

?解析

將其轉化為四皇后問題,便於理解:

將size改為4,然後執行**:

0 1 0 0

0 0 0 1

1 0 0 0

0 0 1 0

第 2 種:

0 0 1 0

1 0 0 0

0 0 0 1

0 1 0 0

在第一種情況下,四皇后問題:

當我們遍歷到第二行第三列放下棋子時,將會遞迴呼叫當前函式,判斷在當前的情況下棋局能否繼續進行下去(i , j)如果能則輸出這種情況,否則結束遞迴的函式回到迴圈中,繼續試驗下乙個位置(j+1),直到輸出所有可能情況。

比如:1 0 0 0

0 0 1 0

0 0 0 0

0 0 0 0

第一行第二行試探成功,但是第三行試探失敗(無法放置)

1 0 0 0

0 0 0 1

0 0 0 0

0 0 0 0

對於這種情況,將會出現第一行第二行第三行成功,第四行放置失敗的情況

1 0 0 0

0 0 0 1

0 1 0 0

0 0 0 0

因此這時候程式返回到第二行的迴圈中,但是由於此時第第二行的迴圈已經結束,宣告了第一列情況下的失敗,返回到第一行的迴圈中,繼續向右查詢,經過回溯遞迴,出現了我們第一種情況的成功:

0 1 0 0

0 0 0 1

1 0 0 0

0 0 1 0

以此類推,也可以算出第二次的成功樣例。

資料結構 八皇后問題

八皇后問題簡述 即求8 8的棋盤的所有合法布局,所為合法布局就是 棋盤上共擺放八個棋子,使得每兩個棋子都不在棋盤上的同一行 或者同一列 或同一對角線。在查詢所有情況過程中利用回溯法,回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必要搜尋的窮舉式搜尋法。這種方法適用於解一些組合數相當大的問...

資料結構08 八皇后問題

目錄 一 遞迴實現八皇后問題分析 二 實現 1.定義乙個棋盤,並定義乙個列印棋盤的方法 2.判斷某個格仔是否可以放置皇后 3.設計棋盤 1.每一次回溯計算出一行中滿足條件的格仔 2.回溯的方法中,會利用乙個迴圈來判斷一行中滿足條件的格仔,即一行中滿足的列 3.當行數自增到8行時,每次迴圈得到的二維陣...

資料結構演算法 八皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848 年提出 在 88 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 92 理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通...