折半算法的解决完整文档_第1页
折半算法的解决完整文档_第2页
折半算法的解决完整文档_第3页
折半算法的解决完整文档_第4页
折半算法的解决完整文档_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构第二次上机作业班级:070921姓名:张玲玲学号:07092017报告名称:利用递归进行编程上机时间:2010年9月29日报告时间:2010年10月5日实验目的:深入了解函数的调用与返回;理解递归函数的执行过程;学会利用函数的执行过程。实验方法:利用把迭代公式翻译成代码和确定终止代码的方法,写出递归函数,从而执行程序。实验结果:程序运行成功,顺利得出结果。题1:八皇后问题【在8*8的棋盘上放置八个皇后,要求这八个皇后相互不能攻击(同行,同列,斜线)】一、 问题重述:八皇后问题要求在一个的棋盘上放上个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击按照国际象棋的规则,

2、一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。 而我的目的也是通过用C语言平台将一个的棋盘上放上个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现 使用递归方法最终将其问题变得一目了然,更加易懂。二、 算法描述:A、 数据初始化。B、 从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领)。如果是,摆放第n个皇后,并宣布占领(记得姚横列竖列斜列一起设置),接着进行递归;如果不是,测试下

3、一个位置(n,m+1),但是如果当n<=8,m=8时,发现此时已无法摆放时,便要进行回溯。从问题的某一种可能出发,搜索从这种情况能出发,继续搜索,这种不断“回溯”的寻找解的方法,称为“回溯法”。C、使用数组实现回溯法的思想。D、当n>8时,便打印出结果。E、输出函数我使用printf输出,运行形式为:第m种方法为:* * * * * * * * 算法流程图:三、 结构体变量说明:int iCount = 0; /!记录解的序号的全局变量。int SiteQUEENS; /!记录皇后在各行上的放置位置的全局数组。void Queen(int n); /!递归求解的函数。void Ou

4、tput();/!输出一个解。int IsValid(int n); /!判断第n个皇后放上去之后,是否有冲突。四、函数说明:解决冲突问题: 在这个问题中包括了行,列,两条对角线; 列:规定每一列放一个皇后,不会造成列上的冲突; 行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态; 对角线:对角线有两个方向。在这我把这两条对角线称为:主对角线和从对角线。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。 对于数据

5、结构的实现,着重于: 数组aI:a I表示第I个皇后放置的列;I的范围:1.8; 对角线数组:bj(主对角线),cj(从对角线),根据程序的运行,去决定主从对角线是否放入皇后;五、 程序执行结果:六、 遇到的问题:当用printf输出时,出现了一些错误,几经调试后,发现原来是缺少了stdio.h这样一个头文件,添加了头文件后, 还出现了一些问题,逻辑错误导致程序死循环或不循环或循环一小部分,但是编译时却没有错误,就是没有正确的输出答案,一开始我也不知道是怎么回事,通过和同学的交流,发现是逻辑错误,经过改正后,程序终于可以运行了.七、 附录:程序源代码#include <conio.h&g

6、t;#include <math.h>#include <stdlib.h>#include <stdio.h>#include <iostream.h>#define QUEENS 8int iCount = 0; /!记录解的序号的全局变量。int SiteQUEENS; /!记录皇后在各行上的放置位置的全局数组。void Queen(int n); /!递归求解的函数。void Output();/!输出一个解。int IsValid(int n); /!判断第n个皇后放上去之后,是否有冲突。void main() system("

7、;title递归算法八皇后问题 ");cout<<" "<<"八皇后的解法:"<<endl;cout<<" "<<"-"<<endl; Queen(0); /!从第0行开始递归试探。 getch();/!按任意键返回。 void Queen(int n) /*-Queen:递归放置第n个皇后,程序的核心!- -*/ int i; if(n = QUEENS) /!参数n从0到8试出一个解,将它输出并回溯。 Output(); retu

8、rn; for(i = 1 ; i <= QUEENS ; Siten = i; /!在该行的第i行上放置皇后。 if(IsValid(n) /!如果放置没有冲突,就开始下一行的试探。 Queen(n + 1); int IsValid(int n) /*判断第n个皇后放上去之后,是否合法无冲突。*/ int i; for(i = 0 ; i < n ; i+) /!将第n个皇后的位置依次于前面n1个皇后的位置比较。 if(Sitei = Siten) /!两个皇后在同一列上,返回0。 return 0; if(abs(Sitei - Siten) = (n - i) /!两个皇后

9、在同一对角线上,返回0。 return 0; return 1; /!没有冲突,返回1。 void Output() /*输出一个解,即一种没有冲突的放置方案。*/ int i; printf("No.%-5d" , +iCount); /!输出序号。 for(i = 0 ; i < QUEENS ; i+)/!依次输出各个行上的皇后的位置,即所在的列数。 printf("%d " , Sitei); printf("n"); 题2:折半查找【用递归函数实现折半查找算法】一、 问题重述:此程序即对于一个有序数列,满足s(1)s(

10、2).s(n),写出查找关键字为key的数据的折半查找的算法。首先将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。二、 算法描述:折半查找的基本思路:先检查中间的数据是否是所需的数据,若不是则判断要查找的数据在中间数据的哪一边,下一次就在这个范围内查找。1 、首先确定整个查找区间的中间位置 mid = ( a + b )/ 2 2 、用待查关键字值与中间位置的关键字值进行比较; 若相等,则查找成功 若大于,则在后(右)半个区域继续进行

11、折半查找 若小于,则在前(左)半个区域继续进行折半查找 3 、对确定的缩小区域再按折半公式,重复上述步骤。4 、如果限定的范围中只剩下一个数(即起点、终点相同,a=b),而这个数等于key,则返回a,否则每查找到返回-1表示查找失败。折半查找的存储结构可以用一维数组sn表示这个有序数列,数列的起点、终点分别为a和b。三、 结构体变量说明:折半查找递归函数,如果查找成功,函数返回关键字所在位置,否则返回-1定义了一个数组sn为有序数列,a、b分别为查找区间的起点和终点,key为查找关键字四、 函数说明:1、定义了函数half()实现关键字与中间字的比较。2、定义了sort()函数把输入的数值按升

12、序排列。3、定义了主函数void main(),实现递归调用half()函数。五、 程序执行结果:1、 请输入数据的个数(少于100):5请输入5个整数315263521按升序这5个数是:3 15 21 26 35请输入要查找的关键字:36关键字36没找到2、请输入数据的个数(少于100):6请输入6个整数312724453按升序这5个数是:2 27 31 44 53请输入要查找的关键字:44关键字44已找到,位置是4六、 遇到的问题:1、一开始把sort()函数放在了main()函数的后面,提示:【too many arguments to function void sort()'

13、 】。2、在main函数中错误的再次定义了sort函数。七、 附录:#include <stdio.h>int half(int s,int a,int b,int key)int mid;if(a=b)if(key=sa) return (a);else return (-1);else mid=(a+b)/2;if(key<smid) return(half(s,a,mid,key);if(key>smid) return(half(s,mid+1,b,key);if(key=smid) return (mid);void sort(int a,int n)int

14、i,j,temp,p;for (i=0;i<n-1;i+) p=i;for (j=i+1;j<n;j+)if (aj<ap) p=j;temp=ai;ai=ap;ap=temp;main()int a100,i,n,pos,key;printf("n请输入数据的个数(少于100):");scanf("%d",&n);printf("n请输入%d个整数n",n);for (i=0;i<n;i+)scanf("%d",&ai);sort(a,n);printf("n按升序这%d个数是:n",n);for(i=0;i<n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论