演算法分析與設計實驗報告四 回溯法實驗

2021-10-08 05:48:37 字數 3858 閱讀 2438

一、實驗目的

掌握回溯演算法思想

掌握回溯遞迴原理

了解回溯法典型問題

二、實驗內容

編寫乙個簡單的程式,解決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都有兩項任...