C++算法设计完整版.docx
《C++算法设计完整版.docx》由会员分享,可在线阅读,更多相关《C++算法设计完整版.docx(18页珍藏版)》请在冰豆网上搜索。
C++算法设计完整版
本科实验报告
课程名称:
算法设计与分析(C++语言)
实验项目:
算法设计与分析(C++语言)
实验地点:
行勉楼B211
专业班级:
软件1426学号:
2014006281
学生姓名:
李鹏
指导教师:
张晓霞
年月日
实验一分治法合并排序
一、实验目的
1.掌握合并排序的基本思想
2.掌握合并排序的实现方法
3.学会分析算法的时间复杂度
4.学会用分治法解决实际问题
二、实验内容
随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组。
三、实验环境
程序设计语言:
c++
编程工具:
microsoftvisualstudio2010
四、程序代码
//实验1_1_随机数组合并排序.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include//用于p[i]=rand()%100;
#include//用于srand((unsignedlong)time(0));
#include
usingnamespacestd;
constintN=10;//产生长度为N的数组
//输入数组函数
voidinput(int*p,intn){
//添加时间种子,可在每次运行产生不同的伪随机数
srand((unsignedlong)time(0));
for(inti=0;ip[i]=rand()%100;
}
//输出数组函数
voidoutput(int*p,intn){
for(inti=0;icout<cout<}
//归并排序算法
voidMerge(int*p,intn,intleft,intmid,intright){
int*temp=newint[right-left+1];
inti=left,j=mid+1,k=0;
while(i<=mid&&j<=right){
if(p[i]<=p[j])
temp[k++]=p[i++];
else
temp[k++]=p[j++];
}
while(i<=mid)
temp[k++]=p[i++];
while(j<=right)
temp[k++]=p[j++];
for(inti=0,k=left;k<=right;k++,i++)
p[k]=temp[i];
delete[]temp;
}
//分治算法
voidDivide(int*p,intn,intleft,intright){
if(leftintmid=(left+right)/2;
Divide(p,n,left,mid);
Divide(p,n,mid+1,right);
Merge(p,n,left,mid,right);
}
}
int_tmain(intargc,_TCHAR*argv[])
{
inta[N];
input(a,N);
cout<<"产生的随机数组:
"<output(a,N);
Divide(a,N,0,N-1);//调用Divide函数进行分治算法以及合并排序
cout<<"调用Merge(...)之后:
"<output(a,N);
return0;
}
五、实验结果截图(201603020)
//两次运行结果
六、实验总结
本次采用分治算法与归并排序,对一个随机产生数组进行排序,通过本次实验,对分治算法有了一定的认识。
对书本中的只是也有了更深层次的了解。
对一些问题有了新的认识与见解。
希望可以通过类似的算法可以对其解决。
实验二贪心法作业调度
七、实验目的
5.掌握贪心算法的基本思想
6.掌握贪心算法的典型问题求解
7.进一步多机调度的基本思想和算法设计方法
8.学会用贪心法分析和解决实际问题
八、实验内容
设计贪心算法实现作业调度,要求按作业调度顺序输出作业序列。
如已知要处理的作业数n=8,可用机器数m=(1,2,3),作业完成的期限为 d=(4, 2, 4, 5, 6, 4, 5, 7),求该条件下的最大效益。
九、实验环境
程序设计语言:
c++
编程工具:
microsoftvisualstudio2010
十、方法描述和程序代码
//实验2_1_1_贪心算法作业调度问题.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
usingnamespacestd;
constintN=8;//产生N个任务
constintO=3;//有三个机器
constintmachine[O]={1,2,3};
structWork{
intcode;//工作编号
inttime;//工作时限
intprofit;//工作收益
boolflag;//标志是否工作过
}work[N];
voidinput(Work*w,intn);
voidoutput(Work*w,intn);
voidsortprofit(Work*w,intn);
voidstart(Work*w,intn,into);
int_tmain(intargc,_TCHAR*argv[])
{
input(work,N);
sortprofit(work,N);
start(work,N,O);
return0;
}
voidinput(Work*w,intn){
srand((unsignedlong)time(0));
for(inti=0;iw[i].code=i;
w[i].time=1+rand()%8;
w[i].profit=1+rand()%8;
w[i].flag=false;
}
cout<<"作业列表:
"<output(w,n);
}
voidoutput(Work*w,intn){
for(inti=0;icout<<"Work"<<"("<}
voidsortprofit(Work*w,intn){
Worktmp;
for(inti=1;ifor(intj=0;jif(w[j].profittmp=w[j];w[j]=w[j+1];w[j+1]=tmp;
}
cout<<"排序后:
"<output(w,n);
}
voidstart(Work*w,intn,into){
cout<<"安排作业:
"<intend=0;
intnum;
for(inti=0;icout<<"机器"<
";
for(intj=0,num=0;jif(w[j].flag==false&&w[j].time>num){
cout<w[j].flag=true;
end++;
num++;
}
cout<}
cout<<"完成工作项数:
"<}
十一、实验结果截图
十二、实验总结
贪心算法,在当前条件下选最优解来构成整个问题的最优解(接近最优解)。
通过对作业的调度问题等,对此类问题有了更多的认识。
实验三动态规划法求多段图问题
十三、实验目的
9.掌握动态规划算法的基本思想
10.掌握多段图的动态规划算法
11.选择邻接表或邻接矩阵方式来存储图
4、分析算法求解的复杂度。
十四、实验内容
设G=(V,E)是一个带权有向图,其顶点的集合V被划分成k>2个不相交的子集Vi,1
图中所有边的始点和终点都在相邻的两个子集Vi和Vi+1中。
求一条s到t的最短路线。
参考讲义p136图5-24中的多段图,试选择使用向前递推算法或向后递推算法求解多段图问题。
十五、实验环境
程序设计语言:
c++
编程工具:
microsoftvisualstudio2010
十六、算法描述和程序代码
//实验3_1_动态规划算法求多段图.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
#include
usingnamespacestd;
voidInit_Graph(intN,intk,int**S,int**L){
inti,j;
cout<<"请输入两端顶点以及边长(以0结束):
"<cin>>i;
while(i!
=0){
cin>>j;
cin>>L[i][j];
cin>>i;
}
cout<<"请输入每个阶段有哪些点(以0结束)"<inttempnode;
for(i=1;i<=k;i++){
cout<<"请输入第"<
";
j=0;
while
(1){
cin>>tempnode;
if(tempnode)
S[i][j++]=tempnode;
elsebreak;
};
}
}
voidPlan(intN,intk,int**S,int**F,int**L,int*path){
inti,j,t=N;
intm;
intpoint;
point=S[k][0];
for(i=k-1;i>=1;i--){
j=0;
while(S[i][j]!
=0){
m=0;
F[i][j]=INT_MAX;//假设无穷大,找最小值
if(L[S[i][j]][point]==INT_MAX){
while(S[i+1][m]!
=0){
if(L[S[i][j]][S[i+1][m]]!
=INT_MAX){
if(F[i][j]>(F[i+1][m]+L[S[i][j]][S[i+1][m]])){
F[i][j]=F[i+1][m]+L[S[i][j]][S[i+1][m]];
path[S[i][j]]=S[i+1][m];
t--;
}
}
m++;
}
}
else{
while(S[i+1][m]!
=0){
if(F[i][j]>(F[i+1][m]+L[S[i][j]][S[i+1][m]])){
F[i][j]=F[i+1][m]+L[S[i][j]][S[i+1][m]];
path[S[i][j]]=S[i+1][m];
t--;
}
m++;
}
}
j++;
}
}
cout<<"路径上的点为:
";
t=0;
path[t]=1;
cout<t=path[t];
while(t{
cout<t=path[t];
}
cout<";
cout<}
int_tmain(intargc,_TCHAR*arg){
cout<<"本次对教材124页图7-1的五段图进行测试(本行语句仅为提示语句,对该程序的正确性的验证没有任何影响,按要求输入即可)"<intN,k;
inti,j;
int**L,**S,**F;//L:
边的长度;S:
每个阶段的顶点;F:
记录每个阶段的状态中的点到终点的距离
int*path;//保存检索的结果
cout<<"请输入顶点的个数:
";
cin>>N;
cout<<"请输入阶段数:
";
cin>>k;
//申请空间
L=newint*[N+1];
for(i=0;iL[i]=newint[N+1];
for(j=0;j{
L[i][j]=INT_MAX;
}
}
S=newint*[N+1];
for(i=0;iS[i]=newint[N+1];
memset(S[i],0,sizeof(int)*(N+1));
}
F=newint*[N+1];
for(i=0;iF[i]=newint[N+1];
for(j=0;jF[i][j]=0;
}
}
path=newint[N+1];
memset(path,0,sizeof(int)*(k+1));
Init_Graph(N,k,S,L);
Plan(N,k,S,F,L,path);
//释放内存
delete[]path;
for(i=0;idelete[]L[i];
delete[]L;
for(i=0;idelete[]S[i];
delete[]S;
for(i=0;idelete[]F[i];
delete[]F;
return0;
}
十七、实验结果截图
十八、实验总结
利用动态规划法的思路解决问题的方法是自底向上的。
具有最优子结构的特性对从较小问题的解构造较大问题的解释很好的思路。
该方法与分治算法有些类似,利用递归的方法是问题有复杂变简单。
这种思路在交通网络中似乎应用比较广泛,求取两点之间的最短路径,使用这类方法是问题简单化。
实验四回溯法求n皇后问题
十九、实验目的
12.掌握回溯算法的基本思想
13.通过n皇后问题求解熟悉回溯法
14.使用蒙特卡洛方法分析算法的复杂度
二十、实验内容
要求在一个8*8的棋盘上放置8个皇后,使得它们彼此不受“攻击”。
两个皇后位于棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。
现在要找出使得棋盘上8个皇后互不攻击的布局。
二十一、实验环境
程序设计语言:
c++
编程工具:
microsoftvisualstudio2010
二十二、算法描述和程序代码
//实验4(回溯法求n皇后问题).cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
usingnamespacestd;
intkind=0;//统计放置的方法数量
boolplace(int*x,intk,inti){
for(intj=0;jif(x[j]==i||(abs(x[j]-i)==abs(j-k)))
returnfalse;
returntrue;
}
voidnQueens(int*x,intn,intk){
for(inti=0;iif(place(x,k,i)==true){
x[k]=i;
if(k==n-1){
for(i=0;icout<cout<<"";
kind++;
if(kind%6==0)//每6个答案一行
cout<}
else
nQueens(x,n,k+1);
}
}
}
voidnQueens(int*x,intn){
nQueens(x,n,0);
}
int_tmain(intargc,_TCHAR*argv[])
{
intn;
cout<<"解决n-皇后问题,请输入n:
";
cin>>n;
int*p=newint[n];
//n-皇后问题回溯算法
nQueens(p,n);
cout<<"\n经统计总计"<delete[]p;
p=NULL;
return0;
}
二十三、实验结果截图
二十四、实验总结
回溯法利用对问题的部分有规律的穷举对问题进行解答,若对该问题的答案进行判断是,若有条件不满足则进行下一个穷举的答案,剪纸函数个人认为就是这个样子的。
本次实验在编写代码的过程中非常顺利,通过对n-皇后算法,了解了回溯算法的基本思路。
//本次的实验代码仅供参考,请勿抄袭,原创