ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:468.98KB ,
资源ID:6099773      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6099773.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法实验一实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法实验一实验报告.docx

1、算法实验一实验报告武汉轻工大学数学与计算机学院算法分析实验报告指导老师: 汤小月 专 业: 信息管理与信息系统 班 级: 信管1201班 学 号: 姓 名: 实验一 分治与递归(2学时)基本题一:基本递归算法一、实验目的与要求1、熟悉C/C+语言的集成开发环境;2、通过本实验加深对递归过程的理解二、实验内容:掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。三、实验题任意输入一个整数,输出结果能够用递归方法实现整数的划分。具体程序代码如下:#includeusing namespace std;int q(int n,int m) /正整数n的最大加数m的划分数 if(n1)

2、|(m1 if(n=1)|(m=1) return 1; /正整数或者最大加数=1时,只有一种划分情况 if(nm) return q(n,n); /最大加数实际不能大于正整数本身 if(n=m) return q(n,m-1)+1; /递归,n的划分由其q(n,m-1)和n1=n组成 return q(n,m-1)+q(n-m,m); /正整数n的最大加数n1不大于m的划分由n1=m的划分和n1=m-1的划分组成void main() int n,m; cout请输入一个整数n(-1退出):n; while(n=1) cout请输入一个最大加数m:m; cout正整数n的最大加数m的划分数为

3、q(n,m)endl; cout请输入一个整数n(-1退出):n; 进行编译如下:运行结果如下:四、实验步骤1理解算法思想和问题要求;2编程实现题目要求;3上机输入和调试自己所编的程序;4验证分析实验结果;5整理出实验报告。基本题二:棋盘覆盖问题一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法二、实验题: 盘覆盖问题:在一个2k2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。三、实验提示void c

4、hessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) return; int t = tile+, / L型骨牌号 s = size/2; / 分割棋盘 / 覆盖左上角子棋盘 if (dr tr + s & dc tc + s) / 特殊方格在此棋盘中 chessBoard(tr, tc, dr, dc, s); else / 此棋盘中无特殊方格 / 用 t 号L型骨牌覆盖右下角 boardtr + s - 1tc + s - 1 = t; / 覆盖其余方格 chessBoard(tr, tc, tr+s-1, tc

5、+s-1, s); / 覆盖右上角子棋盘 if (dr = tc + s) / 特殊方格在此棋盘中 chessBoard(tr, tc+s, dr, dc, s); else / 此棋盘中无特殊方格 / 用 t 号L型骨牌覆盖左下角boardtr + s - 1tc + s = t; / 覆盖其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s); / 覆盖左下角子棋盘 if (dr = tr + s & dc = tr + s & dc = tc + s) / 特殊方格在此棋盘中 chessBoard(tr+s, tc+s, dr, dc, s); else /

6、 用 t 号L型骨牌覆盖左上角 boardtr + stc + s = t; / 覆盖其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s); 编写程序代码如下:#include using namespace std; int board6565,tile; /* tile 为纸片编号*/ void chessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) return; int t = tile+, / L型骨牌号 s = size/2; / 分割棋盘 / 覆盖左上角子棋盘 if (d

7、r tr + s & dc tc + s) / 特殊方格在此棋盘中 chessBoard(tr, tc, dr, dc, s); else / 此棋盘中无特殊方格 / 用 t 号L型骨牌覆盖右下角 boardtr + s - 1tc + s - 1 = t; / 覆盖其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s); / 覆盖右上角子棋盘 if (dr = tc + s) / 特殊方格在此棋盘中 chessBoard(tr, tc+s, dr, dc, s); else / 此棋盘中无特殊方格 / 用 t 号L型骨牌覆盖左下角 boardtr + s - 1

8、tc + s = t; / 覆盖其余方格 chessBoard(tr, tc+s, tr+s-1, tc+s, s); / 覆盖左下角子棋盘 if (dr = tr + s & dc = tr + s & dc = tc + s) / 特殊方格在此棋盘中 chessBoard(tr+s, tc+s, dr, dc, s); else / 用 t 号L型骨牌覆盖左上角 boardtr + stc + s = t; / 覆盖其余方格 chessBoard(tr+s, tc+s, tr+s, tc+s, s); /输出最终的结果void result(int b65,int n) int i,j;

9、for(i=1;i=n;i+) for(j=1;j=n;j+) coutbij ; coutendl; int main() int size,dr,dc; cout选择输入4种不同形态的L型骨牌中的一种(4/8/16/64): size; cout请输入特殊的块的位置(x,y): drdc; cout结果如下:endl; boarddrdc=-1; tile+; chessBoard(1,1,dr,dc,size); result(board,size); 运行调试结果如下:试运行结果如下:提高题一:二分搜索一、实验目的与要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、实验题1、设a0:

10、n-1是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最小元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。2、设有n个不同的整数排好序后存放于t0:n-1中,若存在一个下标I,0in,使得ti=i,设计一个有效的算法找到这个下标。要求算法在最坏的情况下的计算时间为O(logn)。三、实验提示1、用I,j做参数,且采用传递引用或指针的形式带回值。bool BinarySearch(int a,int n,int x,int& i,int& j) int left=0; int right=n-1; while(le

11、ftamid) left=mid+1; else right=mid-1;2 i=right; j=left; return false;int SearchTag(int a,int n,int x) int left=0; int right=n-1; while(leftamid) right=mid-1; else left=mid+1; return -1;实验题1代码编写如下:#include using namespace std; void BubbleSort(int* pData,int Count) /冒泡排序的函数,pData中从0位置处存了Count个数,该函数将数组

12、中元素排序 int iTemp; for(int i=1;i=i;j-) if(pDatajpDataj-1) iTemp = pDataj-1; pDataj-1 = pDataj; pDataj = iTemp; bool BinarySearch(int a,int n,int x,int& i,int& j) /数组a大小为n,数组中存放了已经排好序(升序)的数列 int left=0; int right=n-1; int mid=0; while(leftamid) left=mid+1; else right=mid-1; i=right; j=left; return fals

13、e; int SearchTag(int a,int n,int x) int left=0; int right=n-1; while(leftamid) right=mid-1; else left=mid+1; return -1; int main() int a100; coutnum; cout请输入数组中的数:endl; for(int i=0;iai; /下面将数组a排成升序 BubbleSort(a,num); cout下面输出排序后的数组:endl; for(i=0;inum;i+) printf(%4d,ai); coutendl; coutx; int j=0; if(

14、BinarySearch(a,num,x,i,j) cout找到了,位置为iendl; else cout没找到,小于该数的最大元素位置为i大于该数的最小元素的位置为j(第一个元素的位置为0)endl; return 0; 试运行调试结果如下:运行结果如下图所示:实验题2编写代码如下:#include using namespace std; /*根据题目中的隐含要求,现在将问题进行简化,假设数组中存放的数全部为整数*/ void BubbleSort(int* pData,int Count) /冒泡排序的函数,pData中从0位置处存了Count个数, 该函数将数组中元素排升序 int i

15、Temp; for(int i=1;i=i;j-) if(pDatajpDataj-1) iTemp = pDataj-1; pDataj-1 = pDataj; pDataj = iTemp; bool BinaryFind_iei(int a,int n,int& i) /数组a大小为n,数组中存放了已经排好序(升序)的数列 int left=0; int right=n-1; int mid=0; while(leftamid) left=mid; else right=mid; return false; int main() int a100; coutnum; cout请输入数组中

16、的数:endl; for(int ii=0;iiaii; /下面将数组a排成升序 BubbleSort(a,num); cout下面输出排序后的数组:endl; for(int i=0;inum;i+) printf(%4d,ai); coutendl; int j=0; if(BinaryFind_iei(a,num,j) cout找到了,位置为jendl; else cout不存在符合第i个位置等于i的元素。endl; return 0; 试运行调试结果如下:运行结果如下:结果分析:利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等素,而二分法,由于其划分的简单和均匀

17、的特点,是经常采用的一种有效的方法,例如二分法检索。提高题二: 用分治法实现元素选择一、实验要求与目的1、了解分治法的基本思想,掌握递归程序编写方法;2、使用分治法编程,求解线形序列中第k小元素。二、实验内容1、给定线形序列集中n个元素和一个整数k,1kn,输出这n个元素中第k小元素的值及其位置。2、简述该算法的原理、步骤。对该算法与直接排序查找进行比较。3、编写并调试程序。测试要求:元素个数不少于100;分三种情况:k=1、k=n和k=中位数。编写程序代码如下所示:#include #include #include#includeint partition(int a,int p,int

18、r) int z=p,x=r+1; int y=ap; int t; while(1) while(a+zy&zy); if(z=x) break; t=az; az=ax; ax=t; ap=ax; ax=y; return x;void quicksort(int a,int p,int r) int q; if(pr) q=partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); int main() for(;) int k,*a,*b,n,i,d,s; printf(请输入数组个数:); scanf(%d,&n); print

19、f(n); a=(int *)malloc(sizeof(int)*n); /给数组a分配空间 srand(unsigned)time(NULL); b=(int *)malloc(sizeof(int)*n); /给数组b分配空间 srand(unsigned)time(NULL); for(i=0 ;in;i+) ai=rand()%100+ 1; /产生小于100 的数据 for(i=0;in;i+) printf(%dt,ai); if(i+1 )% 10 = 0 ) /每行10个数据 printf(n); printf(n); for(i=0,d=0;dn;d+) /将数组a的值赋给

20、数组b bd=ai; i+; quicksort(a,0,i-1); /调用快速排序进行排序 printf(排序后); printf(n); for(i=0;in;i+) printf(%dt,ai); if(i+1 )% 10 = 0 ) /输出排好序的数组a,每行10个数据 printf(n); printf(n); printf(请输入第k小元素:); scanf(%d,&k); for(d=0;dn;d+) if(bd=ak-1) /从数组b中找出第k小的数在原数组中的位置 s=d+1; printf(第%d小元素为:%d,k,ak-1); printf(n); printf(第%d小元素位置为:%d,k,s); printf(n); system(pause); printf(n); 试运行调试结果如下:运行结果如下:测试一:K=1测试二:K=n(此处为K=n=102)测试三:k=中位数五:实验总结通过此次实验进一步熟悉了C/C+语言的集成开发环境以及进一步加深了对递归过程的理解,理论结合实际让自己对此阶段的知识掌握的更加牢固,收益颇丰。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1