八皇后問題(遞迴實現)

2021-10-23 18:38:23 字數 1627 閱讀 2399

八皇后問題是回溯法的典型例題,就同一問題有許多不同種解法,這裡只通過遞迴解決八皇后問題

所謂八皇后問題是由高斯先生提出的乙個關於西洋棋的數學問題,其要求在8x8的棋盤上放置8個皇后,每個皇后之間不能互相攻擊到對方(皇后的攻擊方式是公尺字型),高斯先生窮其一生發現了76鐘解法,在沒有計算機的年代已經非常了不起了。

大體思路:

1.建立乙個8x8的二維陣列來當做棋盤

2.通過迴圈一列一列來擺放皇后

3.每放完8列輸出一次

面臨的問題:

1.如何確定皇后所在位置是否安全

2.從哪遞迴

解決問題:

1.按照皇后的攻擊方式,分別判斷皇后所在列,斜角是否存在別的皇后

2.就從哪開始遞迴而言,每個寫**的人都應該有自己的想法,只提供乙個參考思路,每擺放一行皇后,便遞迴

如果對遞迴不了解可以參考一下

#include

using

namespace std;

int count =0;

void

eightqueen

(int row,

int rank,

int(

*chess)[8

]);int

notdanger

(int row,

int rank,

int(

*chess)[8

]);int

main()

void

eightqueen

(int row,

int rank,

int(

*chess)[8

])}if

(8== row)

cout << endl;

} cout << endl;

count++;}

else*(

*(temp_chess + row)

+ i)=1

;eightqueen

(row +

1,rank,temp_chess);}

}}}int

notdanger

(int row,

int rank,

int(

*chess)[8

])}//判斷左上

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

0&& j>=

0; i--

,j--)}

//判斷右下

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

8&& j<

8; i++

,j++)}

//判斷右上

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

0&& j<

8; i--

,j++)}

//判斷左下

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

8&& j>=

0; i++

,j--)}

return flag;

}

八皇后問題(遞迴實現)

八皇后問題,是乙個古老而著名的問題,是回溯 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋 上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。這裡用遞迴演算法實現,因為遞迴在某個層面上就實現了回溯,再演算法中,...

八皇后 N皇后問題 遞迴實現

八皇后問題,即在乙個棋盤上,每行都可以放置乙個皇后,但每個皇后都不能影響其他皇后的安全,即所有皇后的位置不能在同一直線上 解決問題方法及思想 遞迴 在使用遞迴之前首先要準備好兩個函式實現 1.判斷此時此刻位置是否安全 只需要判斷元素上方,左上方,右上方是否安全,且只要有乙個位置不安全,則結束判斷 2...

八皇后問題遞迴實現(C )

八皇后的遞迴實現,執行程式後,平台只能顯示少部分解,在此,為了方便解集合的檢視,將解集儲存在了 f result.txt 檔案中。實現 如下 include include include using namespace std define n 8 define solu size 100 str...