八皇后問題的回朔法求解

2021-07-10 04:54:17 字數 1584 閱讀 8442

1.問題背景:

前幾天上演算法課的時候老師簡單介紹了一下八皇后問題,課後感覺這個問題挺有趣的所以自己編了一下,發現對於我這種初學者來說還是有一定的難度,下面我詳細分析一下這個問題。

八皇后問題,是乙個古老而著名的問題,是

回溯演算法

的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法? 

高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。

2.求解思想

分析這個問題的初步就是要想辦法設計乙個函式來滿足題目的要求,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。在此之前我們先做一下準備工作,先定義乙個陣列x[8],陣列x的下標用來表示皇后所在的行,陣列x的值用來表示皇后所在的列,這樣皇后的位置就被完全固定了。然後通過陣列元素之間的值來表示皇后之間位置的關係,現在我們只需要考慮皇后不在同一列和同一斜線就可以了。經分析可得皇后在同一列和同一斜線的條件是| x[ i ] - x[ j ] | ==| i - j |或 

x[ i ] == x[ j ],這是問題的乙個關鍵。在編寫這個問題的**時我發現其實最難的是要求出這個問題的所有解,如果強行做的話會感覺思維負擔很重,所以最好要想到用回朔法來簡化思維,對於沒有多少這方面經驗的朋友可能會感覺非常頭疼(在沒有使用回朔法之前我感覺做起來很困難)。**如下:

bool judge(int t)

{ int i;

for(i=1;i

那麼什麼是回朔法呢?就我個人理解:當問題存在多個解的時候,且每個解由多個步驟組成,這時我們可以從解的根節點出發,以空間樹的深度作為優先順序,一步一步的來尋找我們所需要的解,當這一節點的解滿足條件的時候,繼續向下探索,當向下探索遇到節點不滿足的時候,轉向同一深度的節點。如果同一深度的節點都不滿足條件,則返回上一節點的其他同深度節點繼續探索。以此類推,直到遍歷整個空間樹就得到了問題的全部解。**如下:

void backtrack(int n)

{ int j;

if(n>num)

{ result++;

for(int i=1;i<=8;i++)

{ cout<

3.整體**如下

#includeusing namespace std;

/**************************八皇后問題**************************/

static int num;//皇后數目

static int*x; //陣列首位址

static int result;//解的個數

bool judge(int t)//t為現在到第幾行了

{ int i;

for(i=1;inum)

{ result++;

for(int i=1;i<=8;i++)

{ cout<

回朔法 八皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。假設八個皇后的位置分別用x1到x8表示,那麼xi可以取的值為1 8...

python回朔演算法解八皇后問題

八皇后問題的解題思路 總共有92種解法,這裡舉例一種 def place x,k 判斷是否衝突 for i in range 1,k x i x k 判斷是否為同一行 abs x i x k abs i k 判斷是否在k個的對角線上 if x i x k or abs x i x k abs i k...

回溯法求解八皇后問題

問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。問題歷史 八皇后問題最早是由西洋棋棋手馬克斯 貝瑟爾於1848年提出。之後陸續有數學家對其進行研究,...