在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...