八皇后問題 dfs

2022-01-12 23:01:00 字數 2494 閱讀 6784

一、題意解析

西洋棋中的皇后,可以橫向、縱向、斜向移動。如何在乙個8x8的棋盤上放置8個皇后,使得任意兩個皇后都不在同一條橫線、豎線、斜線方向上?八皇后問題是乙個古老的問題,於2023年由一位西洋棋棋手提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,如何求解?以高斯為代表的許多數學家先後研究過這個問題。後來,當計算機問世,通過電腦程式的運算可以輕鬆解出這個問題。

二、如何解決八皇后問題?

所謂遞迴回溯,本質上是一種列舉法。這種方法從棋盤的第一行開始嘗試擺放第乙個皇后,擺放成功後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如果當前位置無法擺放,則向右移動一格再次嘗試,如果擺放成功,則繼續遞迴一層,擺放第三個皇后......

如果某一層看遍了所有格仔,都無法成功擺放,則回溯到上乙個皇后,讓上乙個皇后右移一格,再進行遞迴。如果八個皇后都擺放完畢且符合規則,那麼就得到了其中一種正確的解法。說起來有些抽象,我們來看一看遞迴回溯的詳細過程。

1.第一層遞迴,嘗試在第一行擺放第乙個皇后

2.第二層遞迴,嘗試在第二行擺放第二個皇后(前兩格被第乙個皇后封鎖,只能落在第三格):

3.第三層遞迴,嘗試在第三行擺放第三個皇后(前四格被第一第二個皇后封鎖,只能落在第五格):

4.第四層遞迴,嘗試在第四行擺放第四個皇后(第一格被第二個皇后封鎖,只能落在第二格):

5.第五層遞迴,嘗試在第五行擺放第五個皇后(前三格被前面的皇后封鎖,只能落在第四格):

6.由於所有格仔都「綠了」,第六行已經沒辦法擺放皇后,於是進行回溯,重新擺放第五個皇后第八格。:

7.第六行仍然沒有辦法擺放皇后,第五行也已經嘗試遍了,於是回溯到第四行,重新擺放第四個皇后第七格。:

8.繼續擺放第五個皇后,以此類推......

**:列印所有的擺放方法以及方法總數

#include#include

#include

#include

#include

#include

using

namespace

std;

int num=0

;void output(bool arr[8][8])}

bool check(bool arr[8][8],int row,int column)///

檢查落子是否合法,引數分別是行,列

i=row-1

; j=column-1;///

判斷左上斜線是否有棋子

while(i>=0&&j>=0

)

i--;

j--;

}i=row-1

; j=column+1;///

判斷右上斜線是否有棋子

while(i>=0&&j<8

)

i--;

j++;

}return

true;}

void slove(bool arr[8][8],int row)///

回溯法,核心**

arr[row][column]=false;///

不擺這一顆子,擺下一顆子進行深度搜尋}}

intmain()

八皇后問題 DFS

古老而且典型的回溯問題 八皇后問題 找了採用深度優先 進行實現 思路 一 首先 需要 乙個判斷該位置能不能放的問題 1 乙個同一行 肯定不能放 並且 mat i col 問題了 2 左斜向上的部分肯定不能放 因為這裡是從0 行開始的 先卡第一行 在看第二行 要是左斜向上 有皇后 那麼這個位置不能放 ...

八皇后問題(dfs)

八皇后問題,是乙個古老而著名的問題,是搜尋演算法的經典案例。該問題是國際西洋棋棋手馬克思貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后。使其不能相互攻擊,即任意兩個皇后都不能處於同一行 同一列或者同一斜線,問有多少中擺法。分析 用dfs一行一行得進行擺放,用for迴圈來確定每一列,由於是一...

dfs 八皇后問題

在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。因為我們要保證每個皇后不在同乙個對角線,不在一行,不在一列 所以我們每次把第k個皇后放在第k行,即保證每個皇后都...