前言:
對於接觸過程式設計的朋友來說,最開始了解的演算法莫過於貪心或者遞迴;而提到遞迴,除了本博文前面介紹的漢諾塔問題以外,還有乙個比較有趣的問題——八皇后問題。現在就跟大家理一理,分享一下**的實現思路。
八皇后問題指如何能夠在 8×8
的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?即任兩個皇后都不能處於同一條橫行、縱行或斜線上。
資料結構選擇
方案一:採用8*8
二維陣列儲存棋盤
board(x,y);
方案二:採用8*1
一維陣列儲存棋盤每行放置的皇后位置
q[i];
(為方便**實現,這裡採用一維陣列進行儲存)
step2
遞迴跳出邊界
由於遞迴過程中,每一種符合的方案都必須遍歷到最後一行,因此判斷邊界為」i==8」
step3
放置皇后的向下遞迴規則
根據定義,「任兩個皇后都不能處於同一條橫行、縱行或斜線上」即
(1)q[i]唯一
3.1列出滿足八皇后問題的所有方案
1 #include 2 #include 3 #include 43.2計算總方案數(僅新增一全域性變數)#define n 8
5int q[n]; //
queen position in 8 rows6//
函式宣告
7void
pri();
8void dfs(int);9
void placeon(int ,int
);10
void takeout(int ,int
);11
int canplace(int ,int
);12
intmain()
16//
函式定義
17void
pri()
23 printf("\n"
);24
}25 printf("\n"
);26}27
void dfs(int
x)29
else36}
37}38void placeon(int x,int y)
39void takeout(int x,int y)
40int canplace(int x,int
y)44
return1;
45 }
1 #include 2 #include 3 #include 43.3結果展示:#define n 8
5int q[n]; //
queen position in 8 rows
6int cnt=0; //
全域性變數,方案總數7//
函式宣告
8void dfs(int);9
void placeon(int ,int
);10
void takeout(int ,int
);11
int canplace(int ,int
);12
intmain()
17//
函式定義
18void dfs(int
x)20
else26}
27}28void placeon(int x,int y)
29void takeout(int x,int y)
30int canplace(int x,int
y)34
return1;
35 }
結語:
關於八皇后問題,基於回朔的思想(簡單講就是列舉)利用遞迴的演算法進行實現相當精巧。當然,本博文演算法的實現其實應該還可以剪枝優化,只不過本人在此只是拋磚引玉,希望感興趣的朋友後續自己進行嘗試!
遞迴演算法之八皇后
八皇后問題核心 1 同一行或者同一列不能放置皇后 2 斜率為1 1的對角線上不能有兩個皇后。如圖 實現原理 include include using std cout using std endl int count 0 int detection int board 8 int line,int...
八皇后 遞迴
include iostream using namespace std int number 0 int isleague int row,int j,int chess 8 判斷左上方是否合法 for i row,k j i 0 k 0 i k 判斷右下方是否合法 for i row,k j i...
八皇后問題求解 之遞迴
什麼是八皇后問題?該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊。所以,我們要了解皇后的攻擊模式 皇后可以橫著走任意步數 豎著走任意步數 斜著走任意步數。翻譯過來就是 即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。實際上...