8. 枚举和递归.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
什么是枚举 称硬币 问题描述 问题描述 3、解题思路 3、解题思路 4、参考程序 4、参考程序 4、参考程序 4、参考程序 熄灯问题 问题描述 问题描述 问题描述 问题描述 3、解题思路 3、解题思路 3、解题思路 3、解题思路 4、参考程序 4、参考程序 4、参考程序 讨厌的青蛙 问题描述 问题描述 问题描述 问题描述 问题描述 3、解题思路 3、解题思路 3、解题思路 3、解题思路 4、参考程序 4、参考程序 4、参考程序 4、参考程序 4、参考程序 递归的基本思想 递归的基本思想 放苹果 问题描述 3、解题思路 3、解题思路 4、参考程序 马的走法 2、问题分析 3、参考代码 3、参考代码 课外练习 Xi=X0 + i×dx、Yi=Y1 + i×dy(i3),如果(Xi,Yi)位于稻田之内,则(Xi,Yi)上的水稻必被青蛙踩踏 根据上述规则,只要知道一条青蛙路径上的前两棵被踩踏的水稻,就可以找到该路径上其他的水稻。为了找到全部的青蛙路径,只要从被踩踏的水稻中,任取两棵水稻(X1,Y1)、(X2,Y2),判断(X1,Y1)、(X2,Y2)是否能够作为一条青蛙路径上最先被踩踏的两颗水稻。 解决方案 这个问题的描述中,最基本的元素是被踩踏的水稻。在程序中要选择一个合适的数据结构,来表达这个基本元素。这个数据结构是否合适的标准是:在程序中要表达这个元素时,能否用一个单词或者短语,即用一个变量来表示。 struct PLANT //描述一棵被踩踏的水稻 { int x; //水稻的行号 int y; //水稻的列号 } 这个问题的主要计算是:从被踩踏的水稻中选择两棵(X1,Y1)、(X2,Y2)。判断它们是否能够作为一条青蛙路径上最先被踩踏的两颗水稻。(X1,Y1)、(X2,Y2)唯一确定了蛙跳的方向和步长,从(X2,Y2)开始,沿着这个方向和步长在稻田内走。每走一步,判断所到达位置上(X,Y)的水稻是否被踩踏,直到走出稻田为止。如果在某一步上,(X,Y)没有被踩踏,则表明(X1,Y1)、(X2,Y2)是一条青蛙路径上最先被踩踏的两颗水稻的假设不成立。这个判断的算法在问题求解过程中要反复使用,它的效率成为决定整个计算效率的关键。 用一个PLANT 型的数组plants[5001]表示全部被踩踏的水稻 将plants 中的元素按照行/列序号的升序(或者降序)排列 采用二分法查找plants 中是否有值为(X,Y)的元素:将(X,Y)与plants 中间的元素比较,(1)相等,表明找到了元素;(2)比plants 中间元素的小,继续在plants 的前半部寻找;(3)比plants 中间元素的大,继续在plants 的后半部寻找。 采用上述方法判断每走一步所到达位置上(X,Y)的水稻是否被踩踏,最多只要比较log2N,其中N 是稻田中被踩踏水稻的总量。 #include stdio.h #include stdlib.h int r,c,n; struct PLANT { int x,y; }; PLANT plants[5001]; PLANT plant; int myCompare(const void *ele1,const void *ele2); int searchPath(PLANT secPlant, int dX, int dY); int main(void) { int i,j,dX,dY,pX,pY,steps,max=2; scanf(%d%d,r,c); scanf(%d,n); for(i=0;in;i++) scanf(%d %d,plants[i].x,plants[i].y); //水稻排序,从第一行到最后一行,从左到右,再从上到下 qsort(plants,n,sizeof(PLANT),myCompare); for(i=0;in-2;i++) for(j=i+1;jn-1;j++) { dX=plants[j].x-plants[i].x; dY=plants[j].y-plants[i].y; pX=plants[i].x-dX; pY=plants[i].y-dY; if(pX=rpX=1pY=cpY=1) continue; //说明plants[i]不是青蛙进入稻田的起始点 if(plants[i].x+max*dXr) break;//随着j变化,dX只会增大

您可能关注的文档

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档