八皇后 矩阵链乘 快速排序 合并排序 代码和实验报告.docx
- 文档编号:6358378
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:14
- 大小:73.24KB
八皇后 矩阵链乘 快速排序 合并排序 代码和实验报告.docx
《八皇后 矩阵链乘 快速排序 合并排序 代码和实验报告.docx》由会员分享,可在线阅读,更多相关《八皇后 矩阵链乘 快速排序 合并排序 代码和实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
八皇后矩阵链乘快速排序合并排序代码和实验报告
院系:
计算机学院
实验课程:
算法分析与设计实验
实验项目:
实验二
(应用已经学习的算法技术或者分析算法性能)
指导老师:
曹霑懋
开课时间:
2010~2011年度第2学期
专业:
计算机科学与技术师范类
班级:
09级2班
学生:
程毅
学号:
20092101056
华南师范大学教务处
实验名称:
A.编程实现八皇后问题(验证性实验)
实验目标:
使用深度优先搜索算法以及回溯法的思想进行暴力解题
实验任务:
用8*8的二维数组去模拟皇后所在的棋盘,然后用1标记该位置可以放皇后,用0来标记该位置不可以放皇后。
然后每次有一个合理的八皇后方案,就会counter++,记录摆放的方法,并且输出皇后摆放的坐标。
实验步骤:
1.明确实验目标和实验任务
2.理解实验所涉及到深度优先搜索的算法以及回溯法的思想
3.编写程序实现求解八皇后问题。
4.设计实验数据数据并运行程序,记录运行的结果
程序代码:
/***********************************************************************
这个题目我默认第一个皇后放第一行,第二个皇后放第二行,如此类推。
***********************************************************************/
#include
usingnamespacestd;
structchessboard
{
intb[8][8];//对棋盘的模拟
};
structlocation
{
intx,y;//记录皇后放的坐标
};
chessboardvisited[9];
locationloc[8];
intnum;//记录有多少种方法
voidprint()//输出皇后的方法以及种数
{
inti;
cout<<++num< for(i=0;i<=7;i++) { cout< } cout< } intx1,y1,x2,y2;//用于标记坐标 voidvisit(intx,inty,intstep) { inti; x1=x; y1=y; x2=x; y2=y; visited[step]=visited[step-1];//把上一次标记过不能走的坐标传到下一次 for(i=0;i<8;i++) { visited[step].b[x][i]=0;//与皇后同行的都标为不能放 visited[step].b[i][y]=0;//与皇后同列的都标为不能放 } while(x1<8&&y1<8) { visited[step].b[x1][y1]=0;//与皇后对角线的标记为不能放 x1++; y1++; } while(x2<8&&y2>=0) { visited[step].b[x2][y2]=0;//与皇后对角线的标记为不能放 x2++; y2--; } } voiddfs(intstep) { intj; if(step==9) { print(); } else { for(j=0;j<8;j++) { if(visited[step-1].b[step-1][j]) { loc[step-1].x=step-1;//放置皇后的位置 loc[step-1].y=j; visit(step-1,j,step);//进行标记 dfs(step+1);//递归进行下一个 } } } } intmain() { num=0;//初始化计数变量num memset(visited,1,sizeof(visited));//初始化visited标记数组 dfs (1);//从1开始,1作为步骤参数 return0; } 数据测试: 实验名称: B.矩阵链乘问题(验证性实验) 实验目标: 用动态规划法去解决矩阵链乘,求链乘的最优解。 实验任务: 用6*6的二位数组去模拟需要填写的二维表,然后按照算法的顺序,按对角线的顺序去填写每一个格子的内容。 实验步骤: 1.明确实验目标和实验任务 2.理解实验所涉及到动态规划法的思想 3.编写程序实现求矩阵链乘法的最优解。 4.设计实验数据数据并运行程序,记录运行的结果 程序代码: #include #include usingnamespacestd; intmain() { inttd,n=6,d,i,j,k,temp; intf[6][6]; inta[7]={2,3,5,3,4,10,3}; memset(f,0x7f,sizeof(f)); for(i=0;i { f[i][i]=0;//给对角填上0 } for(d=1;d<6;d++) { for(i=0;i+d<6;i++) { j=i+d;//对角线上i,j关系 for(k=i+1;k<=j;k++) { temp=f[i][k-1]+f[k][j]+a[i]*a[k]*a[j+1]; if(f[i][j]>temp) { f[i][j]=temp; } } } } for(i=0;i<6;i++) { for(j=0;j<6;j++) { if(i<=j)cout< elsecout<<""; } cout< } return0; } 数据测试: 实验名称: C.归并排序与快速排序平均时间比较(验证性实验) 实验目标: 1.比较两种算法在平均情况下哪一个更快 2.加深对时间复杂度概念的理解 实验任务: 1.用C/C++语言编程实现归并排序算法6.3和快速排序算法6.6。 对于快速排序,SPLIT中的划分元素采用三者A(low),A(high),A((low+high)/2)中其值居中者。 2.随机产生20组数据(比如n=5000i,1≤i≤20)。 数据均属于范围(0,105)内的整数。 对于同一组数据,运行快速排序和归并排序算法,并计录各自的运行时间(以毫秒为单位)。 实验步骤: 1.明确实验目标和实验任务 2.理解实验所涉及到动态规划法的思想 3.编写程序实现求矩阵链乘法的最优解。 4.设计实验数据数据并运行程序,记录运行的结果 程序代码: 合并排序: #include #include usingnamespacestd; //copy函数将b[0]至[high-low+1]拷贝到a[low]至a[high] //数组b只是一个辅助数组 template voidcopy(Ta[],Tb[],intlow,inthigh) { inti,size; size=high-low+1; for(i=0;i { a[low]=b[i]; low++; } } template voidmerge(Ta[],Tb[],intlow,intmid,inthigh) { inta1h=low,//指向第一个数组的开头 a1t=mid,//只想第一个数组的结尾 a2h=mid+1,//指向第二个数组的开头 a2t=high,//指向第二个数组的结尾 b1=0,//指向数组b的元素 j; for(j=0;j { if(a1h>a1t)//如果第一个数组拷贝完地话,就去拷贝第二个数组 { b[b1]=a[a2h]; b1++; a2h++; continue; } if(a2h>a2t)//如果第二个数组拷贝完的话,就去拷贝第一个数组 { b[b1]=a[a1h]; b1++; a1h++; continue; } if(a[a1h] {//把小的拷贝进b b[b1]=a[a1h]; b1++; a1h++; continue; } else {//同上 b[b1]=a[a2h]; b1++; a2h++; continue; } } } //对数组a进行合并排序,拆分 template voidmergesort(Ta[],intlow,inthigh) { intmid; T*b=newint[high-low+1]; if(low { mid=(low+high)/2;//取中点 mergesort(a,low,mid);//让左半边进行合并排序 mergesort(a,mid+1,high);//让右半边进行合并排序 merge(a,b,low,mid,high);//左右合并到辅助数组b中 copy(a,b,low,high);//把b拷回到a } } intmain() { inta[20],i,j; srand((unsigned)time(NULL)); for(i=0;i<20;i++) { a[i]=rand()%105+1; } cout<<"排序之前"< for(i=0;i<20;i++) { cout< } cout< mergesort(a,0,19); cout<<"排序之后"< for(j=0;j<20;j++) { cout< } cout< return0; } 数据测试: 快速排序 #include #include usingnamespacestd; template intquickpass(Ta[],intlow,inthigh) { intdown,up; down=low;//指向数组的头部 up=high;//指向数组的尾部+ a[0]=a[low];//把数组的第一个数作为参考值 while(down { while((down { up--;//指针向头部移动 } if(down { a[down]=a[up];//找到了,且指针没有重合,就把扫描到的值填入到空出来的地方 down++; } while((down { down++;//指针向尾部移动 } if(down { a[up]=a[down];//找到了,且指针没有重合,就把扫描到得值填入空出来的地方 up--; } } a[down]=a[0];//最后把参考值填入到空出来的地方 returndown;//返回参考值当前位置 } template voidquicksort(Ta[],intlow,inthigh) { intmid; if(low { mid=quickpass(a,low,high);//对数组进行一趟处理 quicksort(a,low,mid-1);//递归处理左半部分 quicksort(a,mid+1,high);//递归处理右半部分 } } intmain() { inta[21],i; srand((unsigned)time(NULL)); cout<<"排序之前"< for(i=1;i<21;i++) { a[i]=rand()%105+1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 八皇后 矩阵链乘 快速排序 合并排序 代码和实验报告 皇后 矩阵 快速 排序 合并 代码 实验 报告