八皇后問題遞迴和非遞迴演算法

2021-06-13 03:01:13 字數 1050 閱讀 8328

大名鼎鼎的八皇后問題。相信大家都耳熟能詳。

八皇后的是乙個典型的用回溯法求解的問題。在回溯法中的乙個關鍵是要動態儲存求解空間對應的程式所處的狀態,特別是能夠進行狀態「回滾」。當一發現個部分解再往下去不能成為合法的解時,要回溯到這個部分解之前所處的狀態。

程式狀態的「前進」和「回滾」用ban和unban函式來實現。

//ban the column,row,diagonal elements of the queen

void ban(int (*p)[lenth],int m,int n)

}void unban(int (*p)[lenth],int m,int n)

}

然後就是要遞迴遍歷整個求解空間。

void doqueenpussler(int linenum,int (*matrix)[lenth],int result[lenth],int& count)

{ if(linenum==lenth){

for(int i=0;i

遺憾的是,過度的遞迴會造成棧溢位。以上的**,但lenth超過了8後。就提示棧溢位了。可用棧來編寫非遞迴的版本。非遞迴的版本一直適用於lenth較大的情況。

void disp(stackstk)

{ while(!stk.empty()){

coutint i,j;

int obsolete=-1;

for(i=0;i

最後是主程式:

int _tmain(int argc, _tchar* argv)

{ clock_t start_,clicks1,clicks2;

start_=clock();

cout<(clicks1)/static_cast(clocks_per_sec)<(clicks2)/static_cast(clocks_per_sec)<

奇怪的是,照理說非遞迴的版本應該比遞迴的要快。可我的測試中,從4-8都是遞迴的版本快(超過8,就只有非遞迴的執行有效了)。我只能說,stl,你太不給力了。

回溯 八皇后問題(遞迴和非遞迴)

8皇后問題 如何在 8 x 8 的西洋棋棋盤上安排 8個皇后,使得沒有兩個皇后能互相攻擊?如果兩個皇后處在同一行 同一列或同一條對角線上,則她們能互相攻擊。解向量為長度為8 的陣列,記為 solution 因為共有 8個皇后,而棋盤剛好為 8 8,所以每一行肯定會有乙個皇后,那麼我們約定 solut...

八皇后問題(非遞迴版)

include iostream include stack using namespace std const intmaxsize 8 棋盤大小 intchess maxsize maxsize 棋盤 定義棧結點,表示乙個皇后的位置 struct node 進行皇后問題處理 返回找到的答案個數 ...

八皇后問題的非遞迴演算法實現

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。uc科技筆試最後一道題也考了這個,用遞迴演算法最多得2 3的分數,非遞迴...