一、
實驗目的和要求
學習程式設計實現深度優先搜尋狀態空間樹求解實際問題的方法,著重體會求解第乙個可行解和求解所有可行解之間的差別。加深理解回溯法通過搜尋狀態空間樹、同時用約束函式剪去不含答案狀態子樹的演算法思想,會用蒙特卡羅方法估計演算法實際生成的狀態空間樹的結點數。
二、實驗環境
(實驗裝置
)
vsialstudio 2017
三、
實驗原理及內容
1. 要求用回溯法求解8-皇后問題,使放置在8*8棋盤上的8個皇后彼此不受攻擊,即:任何兩個皇后都不在同一行、同一列或同一斜線上。請輸出8皇后問題的所有可行解。
源**:
#include
#include
using namespace std;
bool place(int k, int i, int *x); //判定兩個皇后是否在同一列或在同一斜線上
void nqueens(int k, int n, int *x); //遞迴函式(求解n皇后問題)
void nqueens(int n, int *x);
bool place(int k, int i, int *x)
}returntrue;
}void nqueens(int k, int n, int *x)
cout<< endl;
}else}}
}void nqueens(int n, int *x)
int main()
nqueens(8,x);
return 0;
}2.用回溯法編寫乙個遞迴程式解決如下裝載問題:有n個貨櫃要裝上2艘載重分別為c1和c2的輪船,其中貨櫃i的重量為wi(1≤i ≤ n),且σ??≤?1+?2??=1。問是否有合理的裝載方案可以將這n個貨櫃裝上這2艘輪船?如果有,給出裝載方案。
舉例:當n=3,c1=c2=50,且w=[10,40,40]時,可以將貨櫃1和2裝到第一艘輪船上,貨櫃3裝到第二艘輪船上;如果w=[20,40,40]時,無法將這3個貨櫃都裝上輪船。
源**:
#include
#include
using
namespace
std;
template
<
class
t>
class
loading
} ~loading()
void
backtrack(
inti);
void
show(); };
template
<
class
t>
void
loading
<
t>::backtrack(
inti)
return;
} //搜尋子樹
r-= w[
i- 1]; if
(cw + w[
i- 1] <= c1)
if(cw + r >bestw)
r+= w[i];
} template
<
class
t>
void
loading
<
t>::show()
if(s
cout
<<
"的裝載
"<<
endl;
cout
<<
"第二艘船:";
for(i = 1; i <=n; i++)
cout
<<
"的裝載
"<<
endl;
}
else
cout
<<
"c2超載!
"<<
endl; }
void
main()
演算法設計與分析 實驗1
一 實驗目的和要求 理解分治法的演算法思想,閱讀實現書上已有的部分程式 並完善程式,加深對分治法的演算法原理及實現過程的理解。二 實驗環境 實驗裝置 code blocks13.12 三 實驗原理及內容 一 用分治法實現一組無序序列的兩路合併排序和快速排序。要求清楚合併排序及快速排 序的基本原理,程...
演算法分析與設計實驗十二
問題 給定無向連通圖g和m種顏色,用這些顏色給圖的頂點著色,每個頂點一種顏色。如果要求g的每條邊的兩個頂點著不同顏色。給出所有可能的著色方案 如果不存在,則回答 no 解析 四色猜想 四色問題是m圖著色問題的乙個特例,根據四色原理,證明平面或球面上的任何地圖的所有區域都至多可用四種 顏色來著色,並使...
演算法分析與設計實驗三 檢索演算法設計
在乙個排好序的陣列t 1 n 中查詢x,如果x在t中,輸出x在t的下標j 如果x不在t中,輸出j 01.順序查詢 從第乙個元素x開始逐個與需要查詢的元素key進行比較,當x key時返回x的下標,如果比較到最後都沒有找到,則返回j 0 2.二分查詢 不斷地將有序陣列進行對半分割,並檢查每個分割槽的中...