八皇后問題 回溯 遞迴 回溯 非遞迴

2021-07-25 10:11:37 字數 1782 閱讀 2644

八皇后問題:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

分析:我們可以嘗試在將第乙個皇后擺放在第0行第0列,為了不衝突,將第二個皇后擺放在第1行第3列…依次下去

然後發現第5行每個位置都有衝突,這說明上面4行肯定不能這麼擺放,不然就無解。於是又回到上一行(第4行),找到另乙個不衝突的位置。又繼續在第5行擺放皇后,如果還不滿足,又回到第4行,找另乙個不衝突的位置。這個時候,如果第4行已經找不到另乙個可以擺放的位置了,那麼就又回到上一次(第3行),將皇后擺放在另乙個不衝突的位置。然後又開始第4行擺放皇后……這就是回溯法。

**:回溯+非遞迴

#include 

#include

#include

#include

#include

using

namespace

std;

int queen[9]; //queen[i] 表示第i行的皇后,擺放在第queen[i]列

bool check(int x,int y) //判斷(x,y)位置能否擺放皇后,如果可以,則返回true;

void display() //列印每個皇后的列的位置

}if (flag == 0) //如果迴圈完這一行,每個位置都衝突

else

else i++;}}

cout

回溯+遞迴:基本思路:先從第0列開始考慮,在第0列的所有行迴圈試看能否放皇后,如果能則遞迴下去(找第2列的),又回到同樣的問題(正好是遞迴的特性),就這樣一直遞迴下去,出口是直到放了八個皇后,遞迴函式最低層的返回,隨著函式返回,向上回朔一層,繼續遍歷,直到這層遍歷完,再向上回朔,一直回朔到起始的

#include 

#include

const

int max = 8;

int queen[max],count;

void display()

bool check(int n) // 檢查當前列能否放置皇后

void search(int n) // 回溯嘗試皇后位置,n為橫座標

else

search(n + 1); //否則繼續查詢下乙個皇后}}

}int main()

二、演算法框架:

1、問題的解空間:應用回溯法解問題時,首先應明確定義問題的解空間。問題的解空間應到少包含問題的乙個(最優)解。

2、回溯法的基本思想:確定了解空間的組織結構後,回溯法就從開始結點(根結點)出發,以深度優先的方式搜尋整個解空間。這個開始結點就成為乙個活結點,同時也成為當前的擴充套件結點。在當前的擴充套件結點處,搜尋向縱深方向移至乙個新結點。這個新結點就成為乙個新的活結點,並成為當前擴充套件結點。如果在當前的擴充套件結點處不能再向縱深方向移動,則當前擴充套件結點就成為死結點。換句話說,這個結點不再是乙個活結點。此時,應往回移動(回溯)至最近的乙個活結點處,並使這個活結點成為當前的擴充套件結點。回溯法即以這種工作方式遞迴地在解空間中搜尋,直至找到所要求的解或解空間中已沒有活結點時為止。

運用回溯法解題通常包含以下三個步驟:

(1)針對所給問題,定義問題的解空間;

(2)確定易於搜尋的解空間結構;

(3)以深度優先的方式搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋;

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

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

遞迴 回溯 八皇后問題

八皇后 問題,是乙個古老而著名的問題,是回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法.輸入 無 輸出 8行8列的矩陣,0代表此處無皇后,1表示此處有...

遞迴回溯 八皇后問題

八皇后問題 西洋棋中皇后能橫向,縱向和斜向移動,在這三條線上的其他棋子都可以被吃掉。所謂八皇后問題就是 將八位皇后放在一張8x8的棋盤上,使得每位皇后都無法吃掉別的皇后,即任意兩個皇后都不在同一條橫線,豎線和斜線上 問一共有多少種擺法?解決思路 1.將第一行第一列放入 2.在第二行適合的位置 不在上...