一、實驗目的
掌握回溯演算法思想
掌握回溯遞迴原理
了解回溯法典型問題
二、實驗內容
編寫乙個簡單的程式,解決8皇后問題。
數字全排列問題
任意給出從1到n的n個連續的自然數,求出這n個自然數的各種全排列。如n=3時,共有以下6種排列方式:123,132,213,231,312,321。
注意:數字不能重複,n由鍵盤輸入(n<=9)。
三、演算法思想分析
8皇后問題
基本思想為乙個基本的回溯,從最開始的空棋盤先放乙個棋子,然後根據放置的棋子推演出乙個新的局面,然後下下一行的棋子,一直遞迴的下下去直到最後一行下好,這樣乙個情況就產生成功;如果在中途的某一行沒有地方可以下子,則恢復上一局面,在上一行重新下子,這樣通過樹形的窮舉,即回溯的狀態空間樹,就可以將所有可能都推演一遍。
實現時的演算法描述為:
安全演算法描述:
判斷豎直線,主對角線,副對角線是否有棋子
批處理作業排程問題
基本思想為乙個排序樹,根據排序樹每次推演的情況得到該情況所需排程時間,並與當前最優方案比較,如果排程時間更小,則將當前最小時間與當前情況儲存,直到所有情況都已經推演完畢,最後輸出結果。
排列樹思想基於乙個交換的過程,每次推演時將當前結點與未使用的結點進行交換,得到多種情況,每種情況同樣遞迴呼叫演算法進行推演,最後每個結點都推演過自己的子集,這樣所有的情況就能推演全。
演算法描述
數字全排列問題
基本思想完全就是乙個排列樹,每次完成一次推演輸出當前情況即可。
排列樹演算法描述請見第二題演算法思想概述,在這裡不再贅述。
四、實驗過程分析五、演算法源**及使用者螢幕
1.8皇后問題
①**
#include
using
namespace std;
#define num 50
intqueen
(int res,
int i,
int chess[
][num]
,int column,
int left,
int right,
int n)
} cout << endl;
}//如果沒有,下挖
else
queen
(res, i +
1, chess, column, left, right, n)
;//去皇后
chess[i]
[j]= column[j]
= left[i + j]
= right[i - j + n]=0
;}}return res[0]
;}intmain()
;int column[n]=;
int left[
2* n]=;
int right[
2* n]=;
int count =0;
int res[1]
=;res[0]
=queen
(res,
0, chess, column, left, right, n)
; cout <<
"the total number of the situation is: "
<< res[0]
;system
("pause");
return0;
}
②使用者介面
首先輸入棋盤格數,然後回車返回各個情況的內容與所有情況的個數。
2. 批處理作業排程問題
①**
#include
using
namespace std;
#define num 100
void
jobscheduling
(int jobs[
][num]
,int m,
int i,
int min,
int temp)
int sum =0;
for(
int j =
1; j <= m; j++
) sum +
= jobs[j][2
];} cout << sum << endl;
if(sum < min[0]
)}}else
int tmp = temp[t]
; temp[t]
= temp[i]
; temp[i]
= tmp;
//遞迴向下排程
jobscheduling
(jobs, m, i +
1, min, temp)
;//恢復現場
for(
int k =
1; k <=
2; k++
) tmp = temp[t]
; temp[t]
= temp[i]
; temp[i]
= tmp;}}
}int
main()
for(
int i =
1; i <= m; i++)}
jobscheduling
(jobs, m,
1, min, temp)
; cout <<
"the minimum of the total scheduling time is: "
<< min[0]
<< endl;
cout <<
"the scheduling mechod is: "
;for
(int i =
1; i <= m; i++
)system
("pause");
return0;
}
②使用者介面
首先輸入作業個數,然後輸入每個作業在機器1與機器2上執行的時間,然後回車輸出每個情況的結果與所求的最小時間結果與對應情況。
3. 數字全排列問題
①**
#include
using
namespace std;
#define num 20
void
allsort
(int i,
int n,
int num)
cout << endl;
}else}}
intmain()
allsort(0
, num, n)
;system
("pause");
return0;
}
②使用者介面
首先輸入數字個數,然後回車顯示所有情況。
演算法分析與設計 回溯法實驗報告
演算法導論課程設計成績 題 目 回 溯 法 學院班級 1613013 學 號 16130130216 姓 名 庫 妍 主講教師 張立勇 日 期 2019.5.30 一 0 1 knapsack problem 1 實驗題目 運用回溯法實現實驗3中的0 1揹包問題 2 使用的演算法 回溯法3 演算法分...
演算法分析與設計(五)回溯法
回溯法的基本思想 回溯法有 通用的解題法 之稱。該方法系統地搜尋乙個問題的所有解或任一解。問題解的表示 回溯法將乙個問題的解表示成乙個n元式 x1,x2,xn 的形式。顯示約束 對分量xi的取值限定。隱示約束 為滿足問題的解而對不同分量之間施加的約束。解空間 對於問題的乙個例項,解向量滿足顯式約束條...
演算法實驗4《回溯法》
1.編寫乙個簡單的程式,解決8皇后問題。include using namespace std bool backtrack int list 8 int t return false intmain 2.批處理作業排程問題 問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任...