八皇后問題的遞迴解法與回溯優化

2021-09-09 07:43:53 字數 785 閱讀 8439

關於八皇后問題有很多種解法,今天只寫一種利用全排列的解法,其他的一些解法看情況在整理補充。

全排列演算法

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

對於這個問題如果採用組合數的的方式來列舉每一種情況,那麼將需要

但換個思路,考慮到每行只能放置乙個皇后,每列也只能放置乙個皇后,如果把n列皇后所在的行號依次寫出來那麼就是1~8的乙個

排列。因此只要列舉1~8的所有排列,統計其中合法的方案即可,只有n!個排列,比之前的列舉優秀很多。

#include#includeint n;

int count=0;

int queenlist[10];

bool statustable[10]=;

void nqueen(int index)

if(flag)

count++;

return;

} int x;

for(x=1;x<=n;x++) }

} int main()

事實上,當已經放置了一部分皇后時,可能剩餘的皇后無論怎樣放置都不可能合法,這時就沒必要往下遞迴了,直接返回上層即可。

利用回溯法優化剛剛的演算法

void nqueen(int index)

int x,i;

for(x=1;x<=n;x++)

} if(flag==true)}}}

八皇后問題回溯法解法

def queen a,cur 0 if cur len a 當列遍歷到達第9列,表示乙個八皇后序列生成,結束本輪回溯 print a 列印該序列 return 0for col in range len a a cur flag col,true 初始化當前列的皇后在第0行,flag true f...

八皇后問題C語言解法(遞迴 回溯)

本演算法是經過學習b站up主講解後,整理出來的 編譯無誤,可生成92種方式。include stdafx.h include stdlib.h int place 8 用來記錄當前行的皇后在第幾列 bool flag 8 那一列有皇后占領 bool d1 15 上對角線是否占領 bool d2 15...

八皇后 回溯 與 遞迴

八皇后 在8x8的棋盤上,放置8個皇后,每兩個皇后不能同時出現在乙個列上或一行上或對角線上 回溯法 用棧 陣列arr 8 表示8行,arr i 存放第i行所在的列 1 8 topid表示棧頂位置 從第1行開始賦值 從1到8嘗試 並且檢查衝突 第1行賦值成功後,開始給第2行開始賦值 從1到8嘗試 並且...