八皇后求解(回溯)

2021-09-19 22:51:15 字數 1407 閱讀 9903

八皇后問題

要在8*8的西洋棋棋盤中放8個皇后,使任意兩個皇后都不能互相吃掉。規則:皇后能吃掉同一行、同一列、同一對角線的任意棋子。求所有的解。n=8是就是著名的八皇后問題了。

設八個皇后為xi,分別在第i行(i=1,2,3,4……,8);

那麼何為回溯呢?在樹中我們有一種叫做深度優先的方法,從根節點出發尋找問題解,若不是該問題的解便返回到根節點,直至找到為止。

那麼我們想一下,八個皇后的擺放位置是有很多種的,並且找不出他們的擺放規律,那麼我們只能採用列舉的思想,來乙個個驗證結果。

求解步驟:

假設前n-1行皇后位置已經擺放好,將要放置第n行皇后的位置

若放置位置都不滿足,前n-1行的位置就應該調整

若已經擺放完畢,輸出結果;

**如下:

#include#includeusing namespace std;

void queenmerge(int r);

void output();

#define n 8

int s[8];

int times=0;

int main()

void queenmerge(int r)

for(position=0;position這是其中一組解:

0 0 0 0 0 0 0 *

0 * 0 0 0 0 0 0

0 0 0 0 * 0 0 0

0 0 * 0 0 0 0 0

- 0 0 0 0 0 0 0

0 0 0 0 0 0 * 0

0 0 0 * 0 0 0 0

0 0 0 0 0 * 0 0

如果還沒看明白的話,現在一其來分析下各個**塊的作用

for(i=0;i內層迴圈執行的是判定當前放置位置是否合理,不合理就退出迴圈,如果合理呢?當然我們就繼續下一層的求解啦

也就是if(i==r)

注意

每次找到解後必須存放在乙個位置

那麼有些小夥伴可能問,如果第n行沒有解怎麼辦呢?再仔細想想,這個**塊中函式呼叫自身是不是有點眼熟?沒錯,這是遞迴。我們知道,遞迴是由表及裡的一種較為抽象的演算法,我們就這個問題給與個**的形式來解釋

按照這個步驟,第n層沒有找到解,我們的遞迴就會往之前的第n-1層靠攏,還有我們初始層數是一,函式中下標為0哦,是不可能出現0層或-1層滴。

如有不當之處,還請廣大同行指教.

回溯法求解八皇后問題

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

八皇后回溯

八皇后問題 在8x8格棋盤上擺放8個皇后,任意兩個皇后不能處於同一行 同一列 同一斜線上,問有多少種擺法。思路 第乙個皇后放在第一行第一列 第二個皇后從第二行第一列開始檢測,如果不行,放在第二列 第三列 一直到放完所有皇后,如果中途發現有衝突,回溯改變先前放置的皇后位置 使用乙個一位陣列表示,下標表...

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

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述 輸出8皇后問題所有結果。輸入 沒有輸入。輸出 每個結果第一行是no n 的形式,n表示輸出的是第幾個結果 下面8行,每行8個字元,a 表示皇后,表示空格。不同的結果中,先輸出第乙個皇后位置靠前的結果 第乙個皇后位置相同,先輸出...