《ACM算法与程序设计

《ACM算法与程序设计

ID:37749784

大小:195.50 KB

页数:8页

时间:2019-05-30

《ACM算法与程序设计_第1页
《ACM算法与程序设计_第2页
《ACM算法与程序设计_第3页
《ACM算法与程序设计_第4页
《ACM算法与程序设计_第5页
资源描述:

《《ACM算法与程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、电子科技大学期末解题报告课程:《ACM算法与程序设计》学院:学号:姓名:报告成绩:教师签名:讨厌的青蛙1、链接地址http://poj.grids.cn/problem?id=28122、问题描述在韩国,有一种小的青蛙。每到晚上,这种青蛙会跳越稻田,从而踩踏稻子。农民在早上看到被踩踏的稻子,希望找到造成最大损害的那只青蛙经过的路径。每只青蛙总是沿着一条直线跳越稻田,而且每次跳跃的距离都相同,如图1所示。稻田里的稻子组成一个栅格,每棵稻子位于一个格点上,如图2所示。而青蛙总是从稻田的一侧跳进稻田,然后沿着某条直线穿越稻田,从另一侧跳出去,如图3所示。问题描述青蛙的每一跳都恰好踩在一棵水稻上,

2、将这棵水稻拍倒。可能会有多只青蛙从稻田穿越,有些水稻被多只青蛙踩踏,如图4所示。当然,农民所见到的是图5中的情形,看不到图4中的直线。根据图5,农民能够构造出青蛙穿越稻田时的行走路径,并且只关心那些在穿越稻田时至少踩踏了3棵水稻的青蛙。因此,每条青蛙行走路径上至少包括3棵被踩踏的水稻。而在一条青蛙行走路径的直线上,也可能会有些被踩踏的水稻不属于该行走路径。在图5中,格点(2,1)、(6,1)上的水稻可能是同一只青蛙踩踏的,但这条线上只有两棵被踩踏的水稻,因此不能作为一条青蛙行走路径;格点(2,3)、(3,4)、(6,6)在同一条直线上,但它们的间距不等,因此不能作为一条青蛙行走路径;格点(

3、2,1)、(2,3)、(2,5)、(2,7)是一条青蛙行走路径,该路径不包括格点(2,6)。请你写一个程序,确定在所有的青蛙行路径中,踩踏水稻棵数最多的路径上有多少棵水稻被踩踏。例如,图5的答案是7,因为第6行上全部水稻恰好构成一条青蛙行走路径。输入数据从标准输入设备上读入数据。第一行上两个整数R、C,分别表示稻田中水稻的行数和列数,1≤R、C≤5000。第二行是一个整数N,表示被踩踏的水稻数量,3≤N≤5000。在剩下的N行中,每行有两个整数,分别是一颗被踩踏水稻的行号(1~R)和列号(1~C),两个整数用一个空格隔开。而且,每棵被踩踏水稻只被列出一次。输出要求从标准输出设备上输出一个整

4、数。如果在稻田中存在青蛙行走路径,则输出包含最多水稻的青蛙行走路径中的水稻数量,否则输出0。输入样例67142166422526273461622363646567输出样例73、解题思路这个问题看起来很复杂,其实目的很简单:帮助农民找到为害最大的青蛙。也就是要找到一条穿越稻田的青蛙路径,这个路径上被踩踏的水稻不少于其他任何青蛙路径上被踩踏的水稻数。当然,整个稻田中也可能根本就不存在青蛙路径。问题的关键是:找到穿越稻田的全部青蛙路径。任何一条穿越稻田的青蛙路径L,至少包括3棵被踩踏的水稻。假设其中前两棵被踩踏的水稻分别是(X1,Y1)、(X2,Y2),那么:l令dx=X2-X1、dy=Y2-

5、Y1;X0=X1-dx、Y0=Y1-dy;X3=X2+dx、Y3=Y2+dyl(X0,Y0)位于稻田之外,青蛙从该位置经一跳后进入稻田、踩踏位置(X1,Y1)上的水稻lXi=X0+i×dx、Yi=Y1+i×dy(i>3),如果(Xi,Yi)位于稻田之内,则(Xi,Yi)上的水稻必被青蛙踩踏根据上述规则,只要知道一条青蛙路径上的前两棵被踩踏的水稻,就可以找到该路径上其他的水稻。为了找到全部的青蛙路径,只要从被踩踏的水稻中,任取两棵水稻(X1,Y1)、(X2,Y2),判断(X1,Y1)、(X2,Y2)是否能够作为一条青蛙路径上最先被踩踏的两颗水稻。4、解决方案这个问题的描述中,最基本的元素是被

6、踩踏的水稻。在程序中要选择一个合适的数据结构,来表达这个基本元素。这个数据结构是否合适的标准是:在程序中要表达这个元素时,能否用一个单词或者短语,即用一个变量来表示。structPLANT//描述一棵被踩踏的水稻{intx;//水稻的行号inty;//水稻的列号}这个问题的主要计算是:从被踩踏的水稻中选择两棵(X1,Y1)、(X2,Y2)。判断它们是否能够作为一条青蛙路径上最先被踩踏的两颗水稻。(X1,Y1)、(X2,Y2)唯一确定了蛙跳的方向和步长,从(X2,Y2)开始,沿着这个方向和步长在稻田内走。每走一步,判断所到达位置上(X,Y)的水稻是否被踩踏,直到走出稻田为止。如果在某一步上,

7、(X,Y)没有被踩踏,则表明(X1,Y1)、(X2,Y2)是一条青蛙路径上最先被踩踏的两颗水稻的假设不成立。这个判断的算法在问题求解过程中要反复使用,它的效率成为决定整个计算效率的关键。l用一个PLANT型的数组plants[5001]表示全部被踩踏的水稻l将plants中的元素按照行/列序号的升序(或者降序)排列l采用二分法查找plants中是否有值为(X,Y)的元素:将(X,Y)与plants中间的元素比较,(1)相

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。