#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 理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通...