實驗
五、回溯法
一、實驗目的與要求:
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的取值限定。隱示約束 為滿足問題的解而對不同分量之間施加的約束。解空間 對於問題的乙個例項,解向量滿足顯式約束條...