實驗五 回溯法

2021-09-29 22:11:52 字數 1666 閱讀 7746

實驗

五、回溯法

一、實驗目的與要求:

1、通過回溯法的示例程式理解回溯法的基本思想;

2、運用回溯法解決實際問題進一步加深對回溯法的理解和運用;

二、實驗內容:

1、分析並掌握「符號三角」 問題的回溯法求解方法;

2、分析並掌握「n皇后」 問題的回溯演算法求解方法;

3、練習使用回溯法求解「整數變換」等問題。

三、實驗步驟

1.理解回溯演算法思想和演算法示例;

2.上機輸入和除錯演算法示例程式;

3.理解實驗題的問題要求;

4.上機輸入和除錯自己所編的實驗題程式;

5.驗證並分析實驗題的實驗結果;

6.整理出實驗報告;

四、示例程式1:符號三角形問題

符號三角問題:下面都是「-」。 下圖是由14個「+」和14個「-」組成的符號三角形。2個同號下面都是「+」,2個異號下面都是「-」。

+   +   -   +   -   +   +

+   -   -   -   -   +

-   +   +   +   -

-   +   +   -

-   +   -

-   -

+在一般情況下,符號三角形的第一行有n個符號。符號三角形問題要求對於給定的n,計算有多少個不同的符號三角形,使其所含的「+」和「-」的個數相同。

參考**見教材134頁。請在此基礎上,寫出主函式,並執行程式。

示例程式2:n皇后問題

n皇后問題:在n行n列的棋盤上放置不能互相攻擊的n個皇后。根據西洋棋規則,處在同一行或同一列或同一斜線上的皇后可以互相攻擊。n皇后問題的解滿足以下條件:棋盤每行均放置乙個皇后,且任何2個皇后不在同一列,也不在同一斜線上。

參考**1:

#include

#include

class queen

;bool queen::place(int k)

else}}

int nqueen(int n)

int main()

參考**2:

#include

#include >

class queen

;void queen::swap(int *a,int *b)

bool queen::place(int k)

else}}

int nqueen(int n)

int main()

要求:1.分析以上兩段程式;

2.在程式中新增一些**,使其能夠輸出所有的解。

3.比較兩段程式的時間效率, n皇后問題中n的值比較大時,記錄兩段程式的執行時間。

五、實驗題

nm,執行f,n=[9/2]=4

如果n的值陷入了乙個重複的迴圈,如果在遞迴的過程中,出現了前面計算過的元素,那就說明n是無法轉換成m的。這種方法實現稍微複雜,需要判斷當前所求出的數值之前是否出現過。 另一種簡單的處理方式: 對於m無論如何變換都不能變為n的情況,可以加乙個判斷條件,比如深度達乙個較大值為止(如1000)。

回溯法, 用子集樹實現,子集樹結構為:

回溯返回條件有兩個,乙個是i等於m,另乙個是出現了重複的數字。第二個返回條件可以用乙個函式test來判斷。

剪枝條件:

顯示約束:如果x>m,就剪掉它的左子樹;如果x教材156頁 演算法實現題 5-1子集和數問題。

實驗9 回溯法實驗一

實驗9 回溯法實驗一 oj練習 1.暢通工程續 2.最短路徑問題 3.最短路 4 choose the best route 5 乙個人的旅行 6 hdu today 7 bus system 8 0 or 1 實驗內容 1.程式設計實現dijkstra演算法。輸入 第1行第1個值表示頂點個數,第2...

演算法實驗4《回溯法》

1.編寫乙個簡單的程式,解決8皇后問題。include using namespace std bool backtrack int list 8 int t return false intmain 2.批處理作業排程問題 問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任...

演算法分析與設計(五)回溯法

回溯法的基本思想 回溯法有 通用的解題法 之稱。該方法系統地搜尋乙個問題的所有解或任一解。問題解的表示 回溯法將乙個問題的解表示成乙個n元式 x1,x2,xn 的形式。顯示約束 對分量xi的取值限定。隱示約束 為滿足問題的解而對不同分量之間施加的約束。解空間 對於問題的乙個例項,解向量滿足顯式約束條...