八皇后問題 遞迴 回溯法

2021-06-23 05:08:43 字數 1174 閱讀 2971

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。

求解過程:

採用遍歷的辦法,就是採用將每種情況都驗證的辦法最終找出問題的解,但是蠻力遍歷的話,需要遍歷的資料量太大,計算時間花費太大,所以在遍歷的過程中使用回溯法去掉許多不可能的分支,使問題的規模減小許多。

乙個可行解可以這樣表示,用乙個陣列pos[n](n表示皇后的個數,八皇后即為8)表示每一行的皇后應該放在第幾列。從將第乙個棋子放在第1行的第1列開始一直遍歷完這個棋子固定在這個位置的所有解,然後再將第一行的棋子固定在第一行的第二列,再次遍歷完所有的解,直到第一行的棋子放在最後的一列,再遍歷完,那麼所有的解就都找出來了。因為程式**中已經注釋非常詳細,所以這裡不再重複注釋了。程式**如下:

#include #include using namespace std;

#define n 4 /*設定棋盤寬度*/

char pos[n]; /*每一行的這乙個棋子放置的位置:0~7*/

bitsetstat[n]; /*每一行的空閒位置(除去被行列對角線衝突的位置)*/

bitsetmask[n][n]; /*儲存回溯過程中以前的狀態,因為在對每一行回溯時當時的狀態都不一樣

所以這個單元的大小是stat的n倍,以便儲存n行各自的初始狀態*/

int g_count; /*統計有多少種解法*/

void print() /*列印出當前的可行解*/

queen(n+1); /*本行探測完畢,進行下一行的探測*/

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

stat[j] &= mask[n][j]; /*探測失敗,回退(返回上一次的狀態)*/}}

}int main(int argc, char* argv)

{ int i,j;

g_count=0;

for(i=0;i程式執行結果截圖:

八皇后問題 遞迴 回溯法

八皇后問題,是乙個古老而著名的問題。是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊。即隨意兩個皇后都不能處於同一行 同一列或同一斜線上。問有多少種擺法。高斯覺得有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...

八皇后問題 遞迴回溯法

寫在前面 最開始接觸是資料結構老師在提到過,後來在學python時老師也有提到過,出於好奇就去思考了這個問題,當然,小白的我還是在b站懶貓老師的幫助下學會啦,真棒哈哈哈哈哈哈 這裡主要問題是在於判斷對角線上是否能放,表示上對角線d1,表示下對角線d2,根據老師所說加上自己的理解,同乙個下對角線上 n...

八皇后問題(遞迴,回溯)

八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n 1 或...