1105080105 邓欢 算法设计实验一
- 格式:doc
- 大小:187.00 KB
- 文档页数:5
《算法的设计》作业设计方案(第一课时)一、作业目标:通过本课程的作业设计,帮助学生理解和掌握算法设计的基本概念和方法,培养其问题解决和逻辑思维能力,为后续编程学习打下基础。
二、作业内容:任务一:设计一个简单的排序算法1. 描述一个生活中常见的排序问题,如班级学生成绩排序。
2. 使用流程图或自然语言描述你的算法思路。
3. 实现你的算法,使用合适的数据结构和编程语言。
4. 评估你的算法的效率和可读性。
任务二:寻找数组中的重复元素1. 给定一个长度为n的整数数组,找出数组中重复出现的元素。
2. 使用流程图或自然语言描述你的算法思路。
3. 实现你的算法,使用合适的数据结构和编程语言。
4. 评估你的算法的正确性和效率。
三、作业要求:1. 每位学生需完成至少两个不同的算法设计任务,每个任务需包含完整的算法描述、实现和评估。
2. 作业需在规定时间内完成,并提交电子版作业,包括流程图或代码截图等。
3. 作业应注重逻辑表达和代码实现,避免过于简略或过于复杂。
4. 鼓励创新和尝试不同的算法设计方法,提高问题解决能力。
四、作业评价:1. 评价标准包括算法的正确性、效率和可读性,以及问题描述和实现过程的完整性。
2. 老师将对所有提交的作业进行评分,优秀作业将予以展示和表扬。
3. 学生之间可以互相评价和讨论彼此的作业,取长补短,共同进步。
五、作业反馈:1. 老师将在课后对每位学生的作业进行反馈,指出优点和不足,并提供改进建议。
2. 学生可根据反馈对作业进行修改和完善,以提高自己的学习效果。
3. 优秀作业的反馈将作为下次课程的课前预习资料,促进教学相长。
通过本次作业,学生将能够:1. 理解和掌握算法设计的基本概念和方法。
2. 培养问题解决和逻辑思维能力。
3. 初步体验编程和数据结构的使用。
4. 学会如何评价和改进自己的算法设计。
5. 为后续的编程学习打下坚实的基础。
希望每位学生都能认真完成本次作业,并在下次课程中有所收获!作业设计方案(第二课时)一、作业目标1. 巩固学生对算法基本概念的理解;2. 提高学生设计算法的能力;3. 培养学生解决问题的能力。
通过本次实验,加深对算法设计方法的理解,掌握常用算法的原理和实现方法,提高编程能力。
二、实验内容1. 矩阵链乘问题2. 投资问题3. 完全背包问题4. 数字三角形问题5. 最小生成树问题三、实验原理1. 矩阵链乘问题矩阵链乘问题是指给定一系列矩阵,求这些矩阵连乘的乘积的最小计算代价。
动态规划方法可以有效地解决这个问题。
2. 投资问题投资问题是指给定一组投资方案和初始资金,求在有限的时间内,如何选择投资方案使得最终收益最大。
动态规划方法可以解决这个问题。
3. 完全背包问题完全背包问题是指给定一组物品和背包的容量,求在不超过背包容量的前提下,如何选择物品使得背包中物品的总价值最大。
动态规划方法可以解决这个问题。
4. 数字三角形问题数字三角形问题是指给定一个数字三角形,从顶部到底部求出一条路径,使得路径上的数字之和最大。
动态规划方法可以解决这个问题。
5. 最小生成树问题最小生成树问题是指给定一个加权无向图,求一个包含图中所有顶点的最小生成树。
Prim算法和Kruskal算法是解决此问题的常用算法。
1. 矩阵链乘问题(1)定义一个二维数组dp,dp[i][j]表示从矩阵A[i]到矩阵A[j]的最小计算代价。
(2)初始化dp[i][i]为0,表示单个矩阵的计算代价为0。
(3)对于长度为2的矩阵链,dp[i][i+1]等于矩阵A[i]和A[i+1]的乘积。
(4)对于长度大于2的矩阵链,通过遍历所有可能的分割点,计算dp[i][j]的最小值。
2. 投资问题(1)定义一个二维数组dp,dp[i][j]表示在前i个投资方案中,使用j元资金所能获得的最大收益。
(2)初始化dp[0][0]为0,表示不投资时收益为0。
(3)对于第i个投资方案,遍历所有可能的资金使用情况,更新dp[i][j]的值。
3. 完全背包问题(1)定义一个二维数组dp,dp[i][j]表示在前i个物品中,使用容量为j的背包所能获得的最大价值。
(2)初始化dp[0][0]为0,表示不放入任何物品时价值为0。
武汉工程大学计算机科学与工程学院《算法设计与分析》实验报告{qe=sq[qe].pre;printf("——(%d,%d)",sq[qe].x,sq[qe].y);}}用例:例4有如图所示的七巧板,试设计算法,使用至多4种不同的颜色对七巧板进行涂色(每块涂一种颜色),要求相邻区域的颜色互不相同,打印输出所有可能的涂色方案。
261 475 3代码:#include"stdio.h"int data[7][7]={{0,1,0,0,1,0,1},{1,0,0,1,0,1,0},{0,0,0,1,0,0,1},{0,1,1,0,0,1,1},{1,0,0,0,0,0,1},{0,1,0,1,0,0,0},{1,0,1,1,1,0,0}},n,color[7],total;void tre(int s);void out();int colorsame(int s);void main(){int j;for(j=0;j<7;j++){color[j]=0;}total = 1;tre(0);例7 马的遍历问题在n*m的棋盘中,马只能走日字。
马从位置(x,y)处出发,把棋盘的每一点都走一次,且只走一次,找出所有路径代码:#include<stdio.h>int n=5,m=4;int fx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]={2,1,-1,-2,-2,-1,1,2},a[5][4];int dep,x,y,count;void output();int check(int xx,int yy);void find(int x,int y,int dep);void main(){int i,j;count=0;dep=1;printf("X,Y坐标:");scanf("%d,%d",&x,&y);if(x>n||y>m||x<0||y<0){printf("x,y error!!!!\n");return;}for(i=0;i<n;i++)for(j=0;j<m;j++)a[i][j]=0;a[x][y]=1;find(x,y,2);if(count==0)printf("no solution!\n");例12按排列树搜索解决8皇后问题代码:#include<stdio.h>int a[100],n,s=0,c[100],d[20];void output();void swap(int t1,int t2);void Try(int t);void Try(int t){int j;if(t>n){output();}else{for(j=t;j<=n;j++){swap(t,j);if(c[t+a[t]]==0&&d[t-a[t]+n]==0){c[t+a[t]]=1;d[t-a[t]+n]=1;Try(t+1);c[t+a[t]]=0;。
实验报告. 基于回溯法的0-1背包等问题实验内容本实验要求基于算法设计与分析的一般过程(即待求解问题的描述、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和思想以及求解步骤。
求解的问题为0-1背包。
作为挑战:可以考虑回溯法在如最大团、旅行商、图的m着色等问题中的应用。
实验目的◆理解回溯法的核心思想以及求解过程(确定解的形式及解空间组织,分析出搜索过程中的剪枝函数即约束函数与限界函数);◆掌握对几种解空间树(子集树、排列数、满m叉树)的回溯方法;◆从算法分析与设计的角度,对0-1背包等问题的基于回溯法求解有进一步的理解。
环境要求对于环境没有特别要求。
对于算法实现,可以自由选择C, C++或Java,甚至于其他程序设计语言如Python等。
实验步骤步骤1:理解问题,给出问题的描述。
步骤2:算法设计,包括策略与数据结构的选择。
步骤3:描述算法。
希望采用源代码以外的形式,如伪代码或流程图等;步骤4:算法的正确性证明。
需要这个环节,在理解的基础上对算法的正确性给予证明;步骤5:算法复杂性分析,包括时间复杂性和空间复杂性;步骤6:算法实现与测试。
附上代码或以附件的形式提交,同时贴上算法运行结果截图;步骤7:技术上、分析过程中等各种心得体会与备忘,需要言之有物。
说明:步骤1-6在“实验结果”一节中描述,步骤7在“实验总结”一节中描述。
实验结果步骤1:问题描述。
给定 n个物品,其中第 i 个物品的重量为w i ,价值为 v i 。
有一容积为 W 的背包,要求选择一些物品放入背包,使得物品总体积不超过W的前提下,物品的价值总和最大。
0-1背包问题的限制是,每种物品只有一个,它的状态只有放和不放两种。
0-1背包问题是特殊的整数规划问题,其可用数学语言表述为:对于给定 n >0,W >0,v,w (v i ,w i >0,1≤i ≤n),找出一个 n 元0-1向量x =( x 1, x 2,⋯, x n ) 其中x i ∈{0,1},1≤i ≤n ,使得∑v i n i=1x i 最大,并且∑w i n i=1x i ≤W ,即:max x (∑v i ni=1x i ) s.t.∑w i ni=1x i ≤W, x i ∈{0,1},1≤i ≤n步骤2:算法设计,即算法策略与数据结构的选择。
《算法的设计》作业设计方案(第一课时)一、作业目标1. 让学生理解算法的基本概念,掌握算法设计的基本原则。
2. 通过实践,提高学生的问题解决能力和创新思维能力。
3. 培养学生团队合作和分享精神,激发对信息技术的兴趣。
二、作业内容任务一:设计一个简单的排序算法1. 以小组为单位,针对“随机生成的一组数字”进行排序。
2. 使用循环、条件语句等基本的控制结构描述算法。
3. 算法的设计需要考虑到效率(时间复杂度和空间复杂度)。
4. 记录算法的设计过程和实现过程,并提交一份报告。
任务二:分享与讨论1. 小组之间互相交流和讨论,分享各自的算法设计思路和实现过程。
2. 针对不同的算法,进行比较和评价,讨论哪种算法更优。
3. 归纳总结算法设计的基本原则,如简单性、健壮性、效率等。
三、作业要求1. 独立完成算法的设计和实现,不能抄袭。
2. 报告中要清晰地描述算法的设计思路和实现过程。
3. 小组讨论时,每位同学都要积极参与,提出自己的观点和建议。
4. 按时提交作业,逾期提交将不予评价。
四、作业评价1. 评价标准包括:算法的设计是否合理、实现过程是否清晰、讨论中是否积极参与、报告的完成情况等。
2. 评价方式:教师评价与小组互评相结合。
教师对每位同学的作业进行评分,同时听取小组之间的互评意见,综合给出最终成绩。
3. 评价结果将作为下次课程教学内容安排的依据。
五、作业反馈1. 鼓励学生在完成作业后,将自己的问题和疑惑反馈给教师。
教师会及时回复,帮助学生更好地理解算法设计和实现的相关知识。
2. 对于普遍存在的问题,教师会在课堂上进行集中讲解,确保所有同学都能得到解答。
3. 通过作业反馈和评价结果,教师可以更好地了解学生的学习情况,从而调整教学策略,提高教学质量。
通过本次作业的设计方案,希望能够帮助学生更好地理解和掌握算法设计的基本知识和技能,同时培养他们的团队合作和分享精神,激发对信息技术的兴趣。
在下次课程中,教师将根据作业评价结果,对教学内容进行适当调整,以满足学生的学习需求。
《算法的设计》教学设计一、学习内容分析《算法的设计》是小学信息科技五年级上第三单元《用算法解决问题》第4课的内容。
要用算法解决问题,需要设计具体的算法。
算法包括输入、计算过程和输出基本部分,在设计算法时,学生首先要根据问题的初始条件和目标要求,明确算法的输入和输出;其次需要考虑算法的计算过程,包括算法的选择、数据间的数学关—系,以及所需要使用的控制结构等;最后要把设计出来的算法用自然语言或流程图的形式描述出来。
因此本课安排了确定输—入和输出、设计计算过程、算法的描述三个部分内容。
二、学习对象分析通过前面两个单元的学习,学生对于算法已经有了一定的掌握。
要用算法解决问题,需要设计具体的算法。
算法包括输入、计算过程和输出基本部分,在设计算法时,学生首先要根据问题的初始条件和目标要求,明确算法的输入和输出;其次需要考虑算法的计算过程,包括算法的选择、数据间的数学关—系,以及所需要使用的控制结构等;最后要把设计出来的算法用自然语言或流程图的形式描述出来。
因此本课安排了确定输—入和输出、设计计算过程、算法的描述三个部分内容。
本课编排旨在引导学生在前三节课对问题进行分解、抽象、建模的基础上,设计最短距离问题的算法,使这个问题能用计算机解决。
要求学生根据之前所学的内容构思出算法的设计过程,并进行讨论。
三、教学目标1.了解设计算法的一般流程。
2.学会设计最短距离问题的算法。
3.了解解决同一问题可以使用不同的算法。
【重点与难点】教学重点:学会设计最短距离问题的算法。
教学难点:掌握设计算法的一般流程。
素养指向:掌握设计算法的一般过程。
四、方法策略以学生实践为基础,采取任务驱动式教学,以学为本有效地落实教学目标。
辅以案例分析法、归纳总结法、小组合作法,在解决问题的过程中,体验学习过程,发展计算思维。
五、教学流程(一)复习回顾,导入新知(二)探究模型,新知学习(2)把节点之间弯曲的路抽象成线段。
(3)把节点之间的路程抽象成具体数据。
《算法的设计》作业设计方案(第一课时)一、作业目标本节课的作业旨在帮助学生理解和掌握算法的基本概念,通过实践操作,培养他们的逻辑思维能力和问题解决能力。
二、作业内容1. 基础算法设计练习:学生将被要求设计一个简单的算法,用于找出两个数字中的最大值。
他们需要描述算法的步骤,并使用流程图或其他可视化工具进行展示。
2. 拓展算法设计挑战:为学生提供一些开放性问题,如设计一个算法来寻找数组中的第k个最大元素,或者设计一个算法来解决一个特定的实际问题(如排序、搜索、图遍历等)。
他们需要描述算法的思路,并绘制流程图。
3. 小组合作项目:学生可以自由组合成小组,共同设计并实现一个具有实际应用价值的算法。
例如,他们可以设计一个用于班级成绩统计和排名的算法,或者一个用于在线商城优惠券发放和筛选的算法。
三、作业要求1. 作业应按时提交,提交方式可以是电子文档或实物纸质文档。
2. 提交的作业应清晰、准确地描述算法的设计思路和流程图,并尽可能地使用简单的语言进行说明。
3. 鼓励创新和个性化设计,但请确保作业内容符合小学信息技术课程的教学目标。
4. 小组合作项目应包含小组讨论和分工的记录,以及最终算法的实现和测试报告。
四、作业评价1. 评价标准将包括:算法设计的逻辑性和创新性、流程图的清晰度和准确性、实际实现的效率和效果等。
2. 评价方式将包括教师评价、学生互评和自我评价等多种方式。
3. 对于表现优秀的小组和个人,将给予适当的奖励和表扬,以激励他们继续保持和提高。
五、作业反馈1. 学生提交作业后,教师将对作业进行批改和点评,并及时将反馈信息传达给学生。
2. 对于学生在作业中遇到的问题和困难,教师将提供指导和帮助,以促进他们对算法设计的理解和掌握。
3. 鼓励学生之间互相交流和分享作业经验,共同提高信息技术水平和能力。
通过本节课的作业设计,学生将能够更加深入地理解和掌握算法的基本概念和设计方法,培养他们的逻辑思维能力和问题解决能力,为后续的计算机科学学习打下坚实的基础。
第1篇一、实验目的本次实验旨在通过实际操作,加深对算法设计方法、基本思想、基本步骤和基本方法的理解与掌握。
通过具体问题的解决,提高利用课堂所学知识解决实际问题的能力,并培养综合应用所学知识解决复杂问题的能力。
二、实验内容1. 实验一:排序算法分析- 实验内容:分析比较冒泡排序、选择排序、插入排序、快速排序、归并排序等基本排序算法的效率。
- 实验步骤:1. 编写各排序算法的C++实现。
2. 使用随机生成的不同规模的数据集进行测试。
3. 记录并比较各算法的运行时间。
4. 分析不同排序算法的时间复杂度和空间复杂度。
2. 实验二:背包问题- 实验内容:使用贪心算法、回溯法、分支限界法解决0-1背包问题。
- 实验步骤:1. 编写贪心算法、回溯法和分支限界法的C++实现。
2. 使用标准测试数据集进行测试。
3. 对比分析三种算法的执行时间和求解质量。
3. 实验三:矩阵链乘问题- 实验内容:使用动态规划算法解决矩阵链乘问题。
- 实验步骤:1. 编写动态规划算法的C++实现。
2. 使用不同规模的矩阵链乘实例进行测试。
3. 分析算法的时间复杂度和空间复杂度。
4. 实验四:旅行商问题- 实验内容:使用遗传算法解决旅行商问题。
- 实验步骤:1. 设计遗传算法的参数,如种群大小、交叉率、变异率等。
2. 编写遗传算法的C++实现。
3. 使用标准测试数据集进行测试。
4. 分析算法的收敛速度和求解质量。
三、实验结果与分析1. 排序算法分析- 通过实验,我们验证了快速排序在平均情况下具有最佳的性能,其时间复杂度为O(nlogn),优于其他排序算法。
- 冒泡排序、选择排序和插入排序在数据规模较大时效率较低,不适合实际应用。
2. 背包问题- 贪心算法虽然简单,但在某些情况下无法得到最优解。
- 回溯法能够找到最优解,但计算量较大,时间复杂度较高。
- 分支限界法结合了贪心算法和回溯法的特点,能够在保证解质量的同时,降低计算量。
3. 矩阵链乘问题- 动态规划算法能够有效解决矩阵链乘问题,时间复杂度为O(n^3),空间复杂度为O(n^2)。
《算法的设计》作业设计方案(第一课时)一、作业目标本作业设计旨在通过《算法的设计》课程的学习,使学生掌握算法的基本概念和设计方法,能够运用所学知识解决实际问题,并培养其逻辑思维能力和创新能力。
通过作业的完成,使学生进一步理解算法在信息技术领域的重要性。
二、作业内容1. 基础知识学习:学生需自学算法的基本概念、分类及在信息技术中的应用,并完成相关知识点的学习笔记。
2. 案例分析:选取典型的算法设计案例(如排序算法、搜索算法等),分析其设计思路和实现步骤,并撰写分析报告。
3. 实践操作:学生需运用所学知识,设计一个简单的算法,解决一个实际问题(如学校运动会比赛排名等),并编写算法流程图和代码实现。
4. 小组合作:学生需以小组形式进行案例分析和实践操作的讨论和交流,共同完成作业任务。
三、作业要求1. 基础知识学习要求全面、准确,学习笔记需条理清晰,重点突出。
2. 案例分析要求深入浅出,分析报告需包括案例背景、设计思路、实现步骤和优缺点等内容。
3. 实践操作要求创新、实用,算法设计需符合实际需求,流程图和代码需准确无误。
4. 小组合作要求分工明确,成员间需进行充分的讨论和交流,最终形成小组共同完成的作业成果。
5. 作业需按时提交,并按照教师要求的格式和方式进行提交。
四、作业评价1. 教师根据学生提交的作业成果,从内容、格式、创新性、实用性等方面进行评价。
2. 教师将评价结果及时反馈给学生,指出其优点和不足,并提出改进意见。
3. 教师将学生的作业成绩进行汇总,作为学生学习情况的重要参考。
五、作业反馈1. 教师将评价结果以书面或电子方式反馈给学生,鼓励学生继续努力。
2. 教师可针对学生在作业中出现的共性问题,进行课堂讲解和指导。
3. 教师可鼓励学生之间进行作业交流和分享,促进互相学习和进步。
六、总结本作业设计旨在通过多种方式,帮助学生全面掌握《算法的设计》课程的知识和技能,培养学生的逻辑思维能力和创新能力。
实验名称减治法在组合问题中的应用——8枚硬币问题实验室实验目的或要求1. 实验题目在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。
可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币。
2.实验目的1)深刻理解并掌握减治法的设计思想并理解它与分治法的区别;2)提高应用减治法设计算法的技能。
3)理解这样一个观点:建立正角的模型对于问题的求解是非常重要的。
3. 实验要求1)设计减治算法实现8枚硬币问题;2)设计实验程序,考察用减治技术设计的算法是否高效;3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。
4. 实现提示假设用一个数组B[n]表示硬币,元素B[i]中存放第i枚硬币的重量,其中n-1个元素的值都是相同的,只有一个元素与其他元素值不同,则当n=8时即代表8枚硬币问题。
由于8枚硬币问题限制只允许使用天平比较轻重,所以,算法中只能出现元素相加和比较的语句实验原理(算法基本思想)利用三分法if (p == q){}else if (q - p == 1){if (p > 0){if (arr[p] == arr[0])coin(arr, n, p + 1, q);elsecoin(arr, n, p, q - 1);}else if (q < n - 1){if (arr[p] == arr[n - 1])coin(arr, n, p + 1, q);elsecoin(arr, n, p, q - 1);}}else if (p < q){int temp = (q - p + 1) / 3;int sum1 = 0, sum2 = 0;for(int i = 0; i < temp; i++){sum1 += arr[p + i];sum2 += arr[q - i];}if (sum1 == sum2)//在中间{coin(arr, n, p + temp, q - temp);}else//在两边,不在中间{if (sum1 == arr[p + temp] * temp)//左边的和中间的相等,在右边{coin(arr, n, q - temp + 1, q);}else{coin(arr, n, p, p + temp - 1);}程序代码//******************************************************//* *n枚硬币问题* *//* *通用减治算法* * //* *算法分析与设计* *//******************************************************#include <stdio.h>#include <iostream>#include <stdlib.h>using namespace std;void coin(int arr[], int n, int p, int q){if (n == 2){cout<<"无法判断\n";return;}if (p == q){cout<<"假币的序号为:"<<p+1<<endl;cout<<"假币的重量为:"<<arr[p]<<endl;}else if (q - p == 1){if (p > 0){if (arr[p] == arr[0])coin(arr, n, p + 1, q);elsecoin(arr, n, p, q - 1);}else if (q < n - 1){if (arr[p] == arr[n - 1])coin(arr, n, p + 1, q);elsecoin(arr, n, p, q - 1);}}else if (p < q){int temp = (q - p + 1) / 3;int sum1 = 0, sum2 = 0;for(int i = 0; i < temp; i++){sum1 += arr[p + i];sum2 += arr[q - i];}if (sum1 == sum2)//在中间{coin(arr, n, p + temp, q - temp);}else//在两边,不在中间{if (sum1 == arr[p + temp] * temp)//左边的和中间的相等,在右边{coin(arr, n, q - temp + 1, q);}else{coin(arr, n, p, p + temp - 1);}}}}void ShowCoin(){while(1){int i,n;cout<<"请输入几枚硬币:"<<endl;cin>>n;if(n==0) break;int *arr=new int[n];cout<<"请输入各硬币的重量:"<<endl;for(i=0;i<n;i++)cin>>arr[i];coin(arr, n, 0, n - 1);}}(写不完时,可另加附页。
武汉工程大学计算机科学与工程学院
《算法设计与分析》实验报告
专业班级计算机工程01班实验地点计算机大楼403 学生学号1105080105 指导教师张立
学生姓名邓欢实验时间
实验项目算法基本工具和优化技巧
实验类别基本性实验
实验目的及要求目的与要求:
练习算法基本工具和优化技巧的使用
实验内容要点:
1、熟悉循环和递归的应用
2、熟悉数据结构在算法设计中的应用
3、了解优化算法的基本技巧
4、掌握优化算法的数学模型
成绩评定表
类别评分标准分值得分合计
上机表现积极出勤、遵守纪律
主动完成实验设计任务
30分
实验报告及时递交、填写规范
内容完整、体现收获
70分
说明:
评阅教师:
日期: 2014 年 4 月 5日
实验内容
一、狼找兔子问题:一座山周围有n个洞,顺时针编号为0,1,2.,…,n-1。
一只狼从0
号洞开始,顺时针方向计数,每当经过第m个洞时,就进洞找兔子。
输入m,n,问兔子有没有幸免的机会?如果有,该藏哪里?
代码设计:
void Text1()
{
int a[MAX];
int p,i,j,n,m,b;
j=0,p=0,b=0;
printf("总洞穴数n:");
scanf("%d",&n);
printf("间隔洞穴m:");
scanf("%d",&m);
for(i=0;i<n;i++)
{
a[i]=1;
}
while(a[p]==1)
{
j=(j+m)%n;
a[j]=0;
p=(j+m)%n;
}
for(i=0;i<n;i++)
{
if(a[i]==1)
{
b++;
printf("%d\t",i);
}
}
if(b==0) printf("不存在幸免的兔子!!!\n");
else printf("\n存在幸免兔子总共有%d只\n",b);
}
结果:
1.输入洞穴5个,每隔3个找兔子,无兔子幸免:
2.输入洞穴10个,每隔5个找兔子,幸免兔子为:
二、有52张牌,使他们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张开始,凡是4的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上,以此类推,直到翻的牌超过104张为止。
统计最后有几张正面朝上,以及他们的位置号。
代码设计:
void Text2()
{
int a[53],i,m,n,p;
for(i=0;i<=52;i++)
a[i]=1;
m=0,n=0;
for(i=2;i<=52;i++)
{
p=1;
while(i*p<=54)
{
a[i*p]=1-a[i*p];
p=p+1;
m++;
}
if(m>104) break;
}
printf("正面朝上的牌有:\n");
for(i=1;i<=52;i++)
{
if(a[i]==1)
{ n++;
printf("%d\t",i);
}
}
printf("\n总共有%d张牌朝上\n",n);
}
结果:
三、A、B、C、D、E 5人为某次竞赛的前5名,他们在名次公布前猜名次。
A说:B得第三名,C得第五名。
B说:D得第二名,E得第四名。
C说:B得第一名,E得第四名。
D说:C得第一名,B得第二名。
E说:D得第二名,A得第三名。
结果每个人都猜对了一半,实际名次是什么呢?
代码设计:
void Text3()
{
int a,b,c,d,e;
for(a=1;a<=5;a++)
for(b=1;b<=5;b++)
if(a!=b)
for(c=1;c<=5;c++)
if(c!=a&&c!=b)
for(d=1;d<=5;d++)
if(d!=a&&d!=b&&d!=c)
for(e=1;e<=5;e++)
if(e!=a&&e!=b&&e!=c&&e!=d)
{
e=15-a-b-c-d;
if(((b==3)+(c==5))==1&&((d==2)+(e==4))==1&&((b==1)+(e==4))==1&&((c==1)+(b==2)) ==1&&((d==2)+(a==3))==1)
printf("A,B,C,D,E分别为第%d,%d,%d,%d,%d名\n",a,b,c,d,e);
}
}
结果:
实验总结
这次实验是对算法基本工具和优化技巧的一些了解。
第一个问题通过设置标志信号来判断狼是否进过了该兔子所在的洞穴。
第二个问题是也是设置信号量经过每一轮的变化依次取反最后确定有多少张牌是正面朝上的。
第三个问题是将信息进行数字化然后通过逻辑运算来解决问题。
通过本次的实验让我熟悉循环和递归的应用和数据结构在算法设计中的应用,了解优化算法的基本技巧以及掌握优化算法的数学模型。
让我对今后的算法设计课程更加明白它的用途和增加兴趣。