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; coutn; while(n=1) coutm;正整数n的最大加数m的划分数为q(n,m) 进行编译如下:运行结果如下:四、实验步骤1理解算法思想和问题要求;2编程实现题目要求;3上机输入和调试自
2、己所编的程序;4验证分析实验结果;5整理出实验报告。基本题二:棋盘覆盖问题1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法二、实验题: 盘覆盖问题:在一个2k2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。三、实验提示void chessBoard(int tr, int tc, int dr, int dc, int size) if (size = 1) return; int t = tile+, / L型骨牌
3、号 s = size/2; / 分割棋盘 / 覆盖左上角子棋盘 if (dr tr + s & dc = tc + s) chessBoard(tr, tc+s, dr, dc, s); / 用 t 号L型骨牌覆盖左下角boardtr + s - 1tc + s = t; chessBoard(tr, tc+s, tr+s-1, tc+s, s); / 覆盖左下角子棋盘 if (dr = tr + s & chessBoard(tr+s, tc, dr, dc, s); else / 用 t 号L型骨牌覆盖右上角 boardtr + stc + s - 1 = t; chessBoard(tr
4、+s, tc, tr+s, tc+s-1, 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);编写程序代码如下:#include int board6565,tile; /* tile 为纸片编号*/ int t = tile+, / L型骨牌号 boardtr + s - 1tc + s = t;/输出最终的结果void result(int b65,int n) int i,j
5、; for(i=1;i=n;i+) for(j=1;jj+)bijdc;结果如下: boarddrdc=-1; tile+; chessBoard(1,1,dr,dc,size); result(board,size); 运行调试结果如下:试运行结果如下:提高题一:二分搜索1、熟悉二分搜索算法;2、初步掌握分治算法;二、实验题1、设a0:n-1是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最小元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。2、设有n个不同的整数排好序后存放于t0:n-1中,若存在一个下标I,0
6、in,使得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(leftamid) left=mid+1; else right=mid-1;2 i=right; j=left; return false;int SearchTag(int a,int n,int x) if(x=amid) return mid; return -1;实
7、验题1代码编写如下:void BubbleSort(int* pData,int Count) /冒泡排序的函数,pData中从0位置处存了Count个数,该函数将数组中元素排序 int iTemp; for(int i=1;Count;i+) for(int j=Count-1;j=i;j-) if(pDataj left=mid; right=mid; for(int ii=0;iitime.hstdio.hmalloc.hint partition(int a,int p,int r) int z=p,x=r+1; int y=ap; int t; while(1) while(a+zy
8、&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;请输入数组个数:); scanf(%d,&n);n a=(int *)malloc(sizeof(int)*n); /给数组a分配空间 srand(unsigned)time(NULL)
9、; b=(int *)malloc(sizeof(int)*n); /给数组b分配空间 for(i=0 ; ai=rand()%100+ 1; /产生小于100 的数据%dt if(i+1 )% 10 = 0 ) /每行10个数据 for(i=0,d=0;dd+) /将数组a的值赋给数组b bd=ai; i+; quicksort(a,0,i-1); /调用快速排序进行排序排序后 if(i+1 )% 10 = 0 ) /输出排好序的数组a,每行10个数据请输入第k小元素:k); for(d=0;d+) if(bd=ak-1) /从数组b中找出第k小的数在原数组中的位置 s=d+1;第%d小元素为:,k,ak-1);第%d小元素位置为:,k,s); system(pause试运行调试结果如下:测试一:K=1测试二:K=n(此处为K=n=102)测试三:k=中位数五:实验总结通过此次实验进一步熟悉了C/C+语言的集成开发环境以及进一步加深了对递归过程的理解,理论结合实际让自己对此阶段的知识掌握的更加牢固,收益颇丰。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1