ACM竞赛试题分析_第1页
ACM竞赛试题分析_第2页
ACM竞赛试题分析_第3页
全文预览已结束

下载本文档

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

文档简介

1、上一次笔者简单地介绍了 ACM/ICPC程序设计竞赛的基本信息和发展状况,这次则试着向大家展示一下其中一 个比较简单的题目,并作出一些粗浅的分析,希望能以此让大家有个更感性的认识。从“蛇和梯子”的问题谈对信息的过滤处理2002年11月2日阿拉伯和北非地区第 5届地区赛 题目G 蛇和梯子问题简述:“蛇和梯子”是一个在N*N ( 0N=20)的方格棋盘上进行的游戏。(见下图)方格从1到N的平方编号。除了 1号和最后1号方格,其他的格子有可能有蛇或梯子存在(蛇和梯子的数量及具体位置由输入确定,它们的数量都在100之内并且蛇和梯子不能临近放置,也就是在任何了放置两者首尾的方格之间至少还有一个未放置任何

2、东西的格子)。开始的时候玩家把他们的标志物放在1号格子中。玩家轮流以扔骰子的方式移动他们的指示物。如果一个指示物到达了一条蛇的嘴部,则把它移回蛇的尾部。如果一个指示物到达 了一个梯子的底部则将它移动到梯子的顶部。如果你是一个可以自由控制骰子的高手,现在请求出你至少需要扔几次骰子才能到达标为 N2的格子。(比如在上图所示例一中,你的方案应该是走4步到达5并由梯子上升到16,再走4步到达20并由梯子上升到33,然后走3步。这样,你一共需要扔 3次骰子。而在例二中,你的方案 应该是连扔4个6。)比较容易看出,这个问题是不能用贪心算法解决的,因为你不能保证在这步到达一个数码比较大的格子就意味着 最好的

3、效率(即使是通过梯子到达了一个这步所能到达的最大号码的格子),也就是说,号码的大小并不能代表 从这个格子到达终点所需要的步数上的多少,这就带给我们一个启发:蛇和梯子真的需要看成是两个东西来分别处理么?实际上确实是不需要的,蛇和梯子的本质就是我们经常在游戏中说的“单向传送点”,只不过梯子的底 部是入口而顶部是出口,蛇的嘴部是入口而尾部是出口罢了,对于他们的描述完全可以选择相同的结构:struct Sn akeA ndLadder int from,to;接下来要考虑的是解决问题的方法。贪心算法被否定之后,我们的选择可能会是搜索,对于本题所采用的搜索显 然应该以广度优先的方式进行,但是稍加分析我们

4、就会发现如果单纯地采用广度优先搜索会产生许多重复的结点,现在我们将指示物处于某格的结点简称为结点 X,那么比如在例1中,第1步过后,队列中存放的结点是 2, 23, 4,16,6,乙在第二步时,当结点 2成为扩展结点时将生成结点 23、4、16、6、7、8,其中只有8不存在 于当前活结点队列中,即使加以判断,不把重复的结点再次加入队列中,那至少也需要对活结点队列进行搜索。实际上我们完全有更好的方法。应该意识到,采用树状结构和搜索的方法处理问题其重要的一点是利用祖先结点的差异性来对儿子结点做不同的 处理。然而在本题中,儿子结点的生成只依赖于父结点的信息而与其它祖先结点无关,所以采用树来描述这个过

5、 程其实是多余的。在走了若干步之后,对于一个特定的格子实际上只有两种状态的区分:1、在走了这些步数之后存在一种方案使指示物位于此格中;2、不存在这样的一种方案。所以我们可以用一个 N2大小的数组来描述若干步之后可以到达的格子的集合, 其中每一个元素描述一个格子的 状态,0表示不存在一种方案到达,1表示存在至少一种方案到达。这样,我们从表示第 n步状态的数组,完全 可以推出表示第n+1步状态的数组,而且在第n+1步状态的数组得到之后, 表示第n步状态的数组也就不再存在 利用价值了。一旦数组中表示最后一个格子的元素成为1,就表示可以通过这个步数完成任务了。比如在例1中,描述棋盘状态的数组其变化过程

6、应该是:描述状态数组元素的内容(从表示第1个格的元素排列到表示最后一个格的 元素)起始状态100000000000000000000000000000000000第1步之后010101100000000100000010000000000000第2步之后000101111111100111101111111110001000第3步之后000001111111111111101111111111111101到第3步之后,数组的最后一个元素已经变为了1,这即表明存在一种方案,使得我们扔3次骰子就可以完成任务。以下是实现此算法的主要部分代码,数组下标0size*size-1的元素分别表示了从第 1格

7、到最后一格的状态,step记录步数,obstacle是struct SnakeAndLadder的向量,描述了蛇和梯子的传送入口和出口:/初始化状态数组和步数记录for (j=1;jsize*size;j+)gridj=0;grid0=1;step=0;while (gridsize*size-1=0)for (j=0;jsize*size;j+)gridbakj=gridj;for (j=O;jsize*size;j+)gridj=O;for (j=0;jsize*size-1;j+)/搜索所有的格子(最后一格不用搜索因为在过程结束前它一定为0)if(gridbakj=O)若在上一步无法到达

8、此格则跳出continue ;for (k=1;ksize*size-1)break ;for (l=0;lobstacle.size();l+)/如果此格是一个传送入口,将传送出口的格子可达if (obstaclel.from=j+k)gridobstaclel.to=1;test=1;break ;if (test=0 & gridj+k=0)gridj+k=1;step+;/步数加一过程执行完毕后,输出step即可。另外,笔者认为此题规定棋盘为N*N大小只是为了输入方便,举例画图方便,实际上多大的棋盘都是一样可以看作一条直线,数组也是用一维的便足够了。通过对这道题的分析,笔者想说的是,ACM竞赛试题其实有一些并没有多大的绝对难度,但是它通过一些附加的信息来制造干扰和人为复杂化,这样,一些没有经验和实力不足的选手在有限的时间内对题目的解决思路和总体难度分析都要产生

温馨提示

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

评论

0/150

提交评论