- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十三章 学生评优(蛮力算法) 内容目标: 蛮力算法基本概念 学生评优蛮力算法实现 数谜问题蛮力算法实现 重难点: 各种蛮力算法设计思想 1.功能描述 某班有n个学生,期末要对该班评选出若干先进学生,评选规则如下: 1:n个学生站成一排,让每个人拿起一朵红花; 2:将编号为2和2的整数倍的学生放下手中的红花。 3:将编号为3和3的整数倍的学生,手中有红花的放下红花,没有红花的拿起红花。.... k:将编号为k和k的整数倍的学生,手中有红花的放下红花,没有红花的拿起红花。.... 依次下去,直到第n次后,手中有红花的学生评为优秀。 2.蛮力算法的基本概念 蛮力法是基于计算机运算速度快这一特性,在解决问题时采用的一种“惰性”的策略。这种策略不经过(或者说是经过很少的)思考,把问题的所有情况或所有过程交给计算机去一一尝试,从中找出问题的解。蛮力策略的应用很广,具体表现形式各异,数据结构过程中学习的:选择排序、冒泡排序、插入排序、顺序查找等,都是蛮力策略的具体应用。比较常用的枚举法和穷举搜索法,本章只讲枚举法。 枚举(Enumerate)法(穷举法)是蛮力策略的一种表现形式,也是一种非常普遍的思维方式。它是根据问题中的条件将可能的情况一一列举出来,逐一尝试从中找出满足问题条件的解。但有的时候一一枚举的情况数目很大,如果超出了所能忍受的范围,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的枚举数目。 用枚举法解决问题,通常可以从两个方面进行算法设计。 找出枚举范围:分析问题所涉及的各种情况。 找出约束条件:分析问题的解需要满足的条件,并用逻辑表达式表示。 3.1业务实现---学生评优 算法设计1: 我们可以想到设置n个元素的一维数组a【n】,记录学生的信息和拿花的状态, 1为拿起,0为放下。用数学运算模拟开关,“对i号学生拿花操作”可以转化为算术运算a【i】=1-a【i】。 由题意,得到每次拿起和放下的学生编号如下: 第1次,拿起和放下操作的学生编号为1,2,3,…,n号 第2次,拿起和放下操作的学生编号为2,4,6,…号 第3次,拿起和放下操作的学生编号为3,6,9,…号 …… 第i次,拿起和放下操作的学生编号为i,2i,3i,…号,它们是起点为i,公差为i的等差数列。 数据结构设计: 我们用数组元素a【i】(i=1,2,3,…,n)的初值均为1,用蛮力法通过循环模拟学生红花拿起和放下操作,最后当第i号学生对应的数组元素a【i】为1时,该学生为优秀学生。 3.2业务实现---学生评优 代码实现1: public void yn1() { int n,i,j; //定义局部变量 n=Convert.ToInt16(Console.Read());//输入囚犯的个数n int []a=new int [n+1]; for(i=1;i=n;i++) //为每个囚犯所在的牢房状态付初值 a[i]=1; for(i=1;i=n;i++) { for(j=i;j=n;j=j+i)//执行牢房状态的操作 a[j]=1-a[j]; } for(i=1;i=n;i++) if(a[i]==0) //打印牢房打开的信息 Console.WriteLine(第{0}释放,i); } 3.3业务实现---学生评优 算法设计2: 转动门锁的规则可以有另一种理解,第一次转动的是编号为1的倍数的牢房,第2次转动是编号为2的倍数,第3次转动是编号为3的倍数牢房,…,则狱吏问题是一个因子个数的问题。令d(n)为自然数n的因子个数,这里不记重复的因子,如4的因子为1,2,4共3个因子,而非1,2,2,4.则对于不同的n,d(n)有的为奇数,有的为偶数,具体见下表: n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … d(n)1 2 2 3 2 4 2 4 3 4 2 6 2 4 4 5 … 由于牢房开始是关着的,这样编号为i的牢房,所含1~i之间的不重复因子个数为奇数时牢房最后是打开的,反之牢房最后是关闭的。 3.4业务实现---学生评优 代码实现2: public void yn2() { int s,i,j,n; n=Convert.ToInt16(Console.Read());//输入囚犯的个数n for(i=1;i=n;i++) //逐个循环 { s=1; for(j=2;j=i;j++)//求每个给定i的因子个数 { if(i%j==0) s++; } if
您可能关注的文档
最近下载
- 四川水电集团笔试题.pdf VIP
- 百度校招职能笔试题目及答案.doc VIP
- (新统编版)语文四年级上册 第五单元教材解读课件 .pdf
- 深入贯彻中央八项规定精神学习教育测试题和答案(二).doc VIP
- RAZ-J分级阅读小学英语绘本BONK, THE HEALTHY MONSTER(可打印成册).pdf VIP
- AI助力高效工作:开启智能办公新时代.pptx VIP
- 《NB_T 10857-2021 水电工程合理使用年限及耐久性设计规范》贯标培训.pptx VIP
- ASME B16.5-2003管法兰和法兰管件NPS 1-24(有-2013).pdf VIP
- 微型腹腔镜下内环口闭合术治疗小儿腹股沟斜疝.pdf VIP
- 最新教科版小学科学二年级上册教案全册教案(最全).doc VIP
文档评论(0)