八皇后問題 DFS

2021-06-21 22:47:16 字數 1646 閱讀 5099

古老而且典型的回溯問題 , 八皇后問題:  找了採用深度優先 進行實現 :

思路: 

一、首先 需要 乙個判斷該位置能不能放的問題: 

1、乙個同一行 肯定不能放  並且  mat[i][col] 問題了

2、左斜向上的部分肯定不能放 ,因為這裡是從0 行開始的(先卡第一行 在看第二行)要是左斜向上 有皇后 那麼這個位置不能放 mat[row-1][col-1] 問題

3、因為這裡是 好吧 這個圖: 不知道能不能貼出。。。。 因此右向上也不能放 這個就是 mat[row-1][col+ 1]問題了

二、就是dfs() 函式了

這裡的dfs是用 遞迴實現的 對於遞迴實現 那麼就有幾個藥注意的問題了:

1、 第一出遞迴條件, 這裡採用的是if(k >= 8) 出遞迴 因為這裡k表示的是行 , 因此當執行到第八行是就全部結束了, 也就出遞迴了 

2、其次就是, 在迴圈裡 這裡是列迴圈。。。滿足放置條件那麼放置 mat[k][i] = 1: dfs(k+1) 繼續往下搜 mat[k][i] = 0 回溯

三、 就是解決問題的函式  solve()

1、初始化過程 

2 、 就是dfs ;然後也就差不多了。。。

下面給出其中乙個例項: 

下面是**:

#include#include#includeusing namespace std;

class eightqueen

;//下面就寫出個函式即可

bool eightqueen::check(int row , int col)

for(int i = 0; row- i >=0 && col - i>= 0 ; i++)

for(int i = 0 ;col + i < 8 && row - i >= 0 ;i++)

//其他情況 可以放置

return true;

}void eightqueen::output()

putchar('\n'); //換行

}}void eightqueen::dfs(int k)

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

}}void eightqueen::solve()

//下面需要乙個類的物件

eightqueen one;

int main()

八皇后問題(dfs)

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

八皇后問題 dfs

一 題意解析 西洋棋中的皇后,可以橫向 縱向 斜向移動。如何在乙個8x8的棋盤上放置8個皇后,使得任意兩個皇后都不在同一條橫線 豎線 斜線方向上?八皇后問題是乙個古老的問題,於1848年由一位西洋棋棋手提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或...

dfs 八皇后問題

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