遞迴之八皇后

2022-03-12 01:36:37 字數 2404 閱讀 1211

前言:

對於接觸過程式設計的朋友來說,最開始了解的演算法莫過於貪心或者遞迴;而提到遞迴,除了本博文前面介紹的漢諾塔問題以外,還有乙個比較有趣的問題——八皇后問題。現在就跟大家理一理,分享一下**的實現思路。

八皇后問題指如何能夠在 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 4

#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 }

3.2計算總方案數(僅新增一全域性變數)

1 #include 2 #include 3 #include 4

#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 }

3.3結果展示:

結語:

關於八皇后問題,基於回朔的思想(簡單講就是列舉)利用遞迴的演算法進行實現相當精巧。當然,本博文演算法的實現其實應該還可以剪枝優化,只不過本人在此只是拋磚引玉,希望感興趣的朋友後續自己進行嘗試!

遞迴演算法之八皇后

八皇后問題核心 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格的西洋棋上擺放八個皇后,使其不能互相攻擊。所以,我們要了解皇后的攻擊模式 皇后可以橫著走任意步數 豎著走任意步數 斜著走任意步數。翻譯過來就是 即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。實際上...