回溯法 八皇后問題的遞迴與非遞迴演算法

2021-07-09 02:15:00 字數 1163 閱讀 7989

八皇后的問題非常有名,初次理解可能稍有難度,不過多看書,看部落格和**,幾遍下來,也基本清晰。

首先不用想初始的情況,先假設前面已經排列好了幾個皇后,即將排列下乙個皇后。依次遍歷八個位置,然後與之前的進行判斷這個位置是否可行,如可行則進行下乙個皇后,否則則移動位置繼續判斷。很簡單。但是有兩個個問題:

1、不全,某個位置有八種方法排列,你只用了一種,當然你可以每個位置遍歷,但太耗時,回溯法可以解決很大的一部分問題,即當你在對某一行皇后進行放置時,如果一直放不好(到最後),那後面的行就不需要再遍歷了,直接回溯上一行,將上一行的位置後移——依次進行這個步驟,直到第一行,遍歷結束。

2、如何判定當前位置合法?首先,兩個皇后不能同一列(這裡要注意,演算法的遍歷次序是按行來的,所以不必考慮行的情況),其次,不能斜對角。

**如下,很清晰:

#define n 8

/* place(),第乙個引數表示八皇后的列位置,第二個表示當前要插入的八皇后的行數。

*/bool place(int eightqueen,int k)

i++;

}return

true;

}

行是從0開始,而列是從1開始。

1、遞迴解法

int eight_queen[n] = ;

int gcount = 0;

void eight_queen_recursion(int eight_queen,int i)

if(eight_queen[i] <= n)

else

eight_queen_recursion(eight_queen,i);

}else

eight_queen_recursion(eight_queen,i);

}}void main()

; //初始化八皇后的列。每一行的八皇后所在的列

int i = 0;

intcount = 0;

while(i>=0)

if(eight_queen[i] <= n)

else

}else

//如果這一行到最後也沒有找到合適的列,則回溯上一行。

}cout<

將place函式與下面的結合,即是完整的程式。

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

回溯法 試探法 八皇后問題 非遞迴 列印一組解 includeint col 8 int left 15 int right 15 int q 8 void queen void if j 8 int main else printf n return 0 n皇后問題 列印第一組解 include ...

八皇后問題 回溯 遞迴 回溯 非遞迴

八皇后問題 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 我們可以嘗試在將第乙個皇后擺放在第0行第0列,為了不衝突,將第二個皇后擺放在第1行第3列 依次下去 然後發現第5行每個位置都有衝突,這說明上面4行肯定不能這麼擺放...

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

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