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

2021-10-14 03:10:38 字數 906 閱讀 4991

在8×8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

定義乙個一維陣列a[8],下標表示行數,值表示列數:a[行]=列

使用回溯演算法,在第k行放置皇后時,逐列測試安全性,如果安全,在安全位置放置皇后,不安全,則繼續測試下一行,即第k+1行

如果整行都無法放置,則返回k-1行,將a[k-1]移值下一列,重複測試

#include

#include

using

namespace std;

#define n 8

int a[n+1]

;void

show()

// 對角線和列的約束條件

intcheck

(int k)

void

backdata()

else

else k--

;// 回溯

} cout <<

"ans: "

<< count;

}int

main()

#include

#include

using

namespace std;

#define n 8

int a[n]

, count=0;

void

show()

// 對角線和列的約束條件

intcheck

(int k)

void

eight_queen

(int n)

// 遞迴回溯

else}}

}int

main()

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

八皇后的問題非常有名,初次理解可能稍有難度,不過多看書,看部落格和 幾遍下來,也基本清晰。首先不用想初始的情況,先假設前面已經排列好了幾個皇后,即將排列下乙個皇后。依次遍歷八個位置,然後與之前的進行判斷這個位置是否可行,如可行則進行下乙個皇后,否則則移動位置繼續判斷。很簡單。但是有兩個個問題 1 不...

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

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

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

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