- 浏览: 588920 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
13256591118:
0d47afd11cbbe1e95b450395e9632e7 ...
Oracle官方教程之Fork/Join,转载自:并发编程网 -
自己811005:
61411fe54f461f31e60336d7d0ab699 ...
Oracle官方教程之Fork/Join,转载自:并发编程网 -
xiaozhang0731:
suse11.3硬盘安装及注意事项
图1 广度优先路径搜索
书中给出的解法利用了广度优先搜索算法,本质上是一种建立搜索树然后剪枝的策略。具体过程如图 1所示:目标是要找到从左上角的圆形图形(设为图形1)到右下角的圆形图形(设为图形2)之间不超过3个弯的最短路径。首先在图形1所在位置向四个方向进行直线查找,如果在某一方向上找到图形2则结束。否则,记录下所有这四个方向上的空白格子,并在每一个空白格子的其他3个方向上进行直线搜索。如果仍未找到图形2则再次记录下查找过程中沿途记录下来的空白格子(要去掉已经走过的空白格子),仍然在3个方向上进行搜索。若找到则返回结果,若还未找到则说明两个图形之间不存在不超过3个弯的路径。这个算法很直观,就是在有限的转弯次数内不断构建出更大的路径网络,看看能否“覆盖”到被连接的图形,但似乎还可以进一步提高效率,下面就给出我的一些想法。
相同图形对之间的最短路径查找算法
以图2为例,我们的目标是找到图形1和图形2之间的最短路径,我们从图形1出发进行查找动作。由于题目要求最短路径不能超过3个弯,并且我们知道:“直线路径长度≤带有一个弯的路径长度≤带有两个弯的路径长度”,所以下面我们将分三种情况进行讨论。
为了加速程序运行,这里还引入了图3所示的两个辅助数据结构,其中每一个方块中都带有一个二进制位,用来表示在该位置上的格子是否是空格子,0代表是空格子,1代表有图形存在。虽然左右两组数据结构的内容是一样的,但是其组织方式有所不同:左边的二进制位是按列组织的,即一列的二进制位保存在一个int或者long型的变量中,多出来的位用0填满;右边的结构是按行组织的,其他与左边结构类似。这两个结构具体的功能后面用到的时候会详细介绍。
图2 改进的路径查找方法示意图
首先,应该判断是否存在图形1到图形2之间的直线路径。这一点我们可以通过他们的位置信息直接得到,例如图形1的位置是[2,2],图形2的位置是[4,5],很显然二者不会在一条直线上,所以直接跳过这一步。但如果二者在一条直线上的话,还需要判断他们之间是否有障碍物存在。例如,如果图形2在[5,2]的话,我们可以断定二者在同一直线上,但我们还需要检查在二者的直线路径上是否还有其他图形存在。因为两个图形同在第二列上,于是我们取图3左边结构的第二列变量C2(这里假设是一个8位的Byte变量),然后做val=C2&00110000,注意其中的两个1是用来测试在图2的第二列上是否有非空的格子。如果val=0则说明两个图形间存在直线路径,否则说明二者之间不存在直线路径。这一过程的时间复杂度为O(1)。
第二步,查找二者之间是否存在转弯一次的路径。从图中我们可以清楚地看到,这样的路径只有两条,他们组成了一个矩形,图3中蓝色的矩形就是两条路径的组合而成。我们可以用上面的方法分别来测试这两条路径上是否有障碍存在,如果没有障碍则作为最短路径返回,否则就要进行第三步。这一步的时间复杂度也是O(1)。
图3 辅助数据结构
第三步,查找两个图形间是否存在转弯三次的路径。首先我们用书中给出的方法在蓝色矩形内部进行路径查找,但是限制只在“向右”和“向下”两个方向上进行操作。如果没找到所需路径,则需要再次扩大搜索范围。如图2所示,在这一步我们需要把搜索方向在“向上”和“向左”两个方向上扩展,所获得的路径分别用红色框和粉色框表示,这个动作类似于把蓝色框向上和向左拉伸。对于获得的路径上的3条线段,我们只需用第一步所提到的方法来查找是否存在障碍即可,若3条线段都没有障碍则返回该路径作为最短路径;否则继续向两个方向扩展搜索范围直到搜索范围到达格子的边界,若仍未找到则认为两个图形间没有符合条件的最短路径。可以看出,由于不需要对同时对4个方向上所有空闲格子进行广度优先搜索操作,第三步的时间复杂度应该低于书中所给出的算法。
扩展问题的研究和修改意见
扩展问题1的研究
扩展问题1说的是(1)是否可以通过维护任意两个格子之间的最短路径来实现快速搜索。(2)在每次消去两个格子之后,自然更新要更新需要维护的数据,这样的思路有哪些优缺点,如何实现。
粗略想来,由于用户每次只能消除一对图形,即只会用到一个最短路径,但由于实现并不知道用户会选择哪一对图形,所以需要事先计算出所有可能的最短路径并保存起来。此外,采用这种方法的话似乎每次用户消去一对相同图像之后都需要重新计算出当前所有可能被连接的相同图形之间最短路径,这是因为当某些图像被消去之后可能会产生很多新路径,而我们又不能确定这些空出来的格子到底能够影响哪些路径,所以就只好都重新计算一遍。其缺点很明显就是每次消去图形动作之后重新计算所有可能的最短路径所需要消耗的时间;而该方法的优点则是可以很快地判断两个相同图形之间是否存在满足条件的最短路径。
如果用户很厉害,每次都能选中可以消除的图形对,那么用这种方法浪费的时间就会相当可观,毕竟用户未选中的其他可以连接的图形对之间的最短路径都被浪费掉了;而如果用户很差劲,每轮选择的次数都远远大于当前可能的连接数量时,该方法就会比书中正文提到的方法高效。但这种情况是比较少的,因为在整个游戏中用户主要是会用眼睛“找”而不是频繁的用鼠标去“试”。所以总的来看,维护所有最短路径的方法的效率相对比较低。
修改意见
(一)书中给出了这个游戏几个关键点是:怎样求出相同图像之间的最短路径(路径的转弯数最少,经过的格子数最少,书中规定路径不能超过两个弯)。然而让人迷惑的是,在“分析与解答”的开始部分数中提到了用自动机模型来描述游戏设计,当时我想难道本章会有像字符串匹配问题那样利用自动机进行问题求解的方法吗?但是在后面却没有看到任何应用自动机理论来解决问题或进行算法优化的内容。虽然游戏设计时常常会用自动机来描述游戏的状态转换,但书中本章的主旨是寻找相同图像之间不超过3个弯的最短路径,并没有将自动机的能力应用到算法中以加速寻径过程;退一步说,如果只是讲游戏设计的通常做法的话,那又和本章的内容有什么联系?所以还是建议去掉这一段以免造成误解。
(二)关于扩展问题(1)的题干我想应该不是“任意两个格子”之间的最短路径,因为维护这样的路径是没有意义的。而应该是“任意两个带有相同图像的格子”之间的最短路径才对。
转载地址:http://blog.csdn.net/kabini/article/details/2598524
发表评论
-
super与this
2014-11-14 18:00 0class FieldBase { int i = ... -
strictfp,与“移植”有染,与“精确”无关,转载自:fbysss的专栏
2014-11-12 11:00 0一、前言 本文是针 ... -
关于Java中的IEEE765浮点数表示法,转载自:不懂不懂
2014-11-11 16:55 0float转十六进制: 16进制浮点数的表示方法,根据IEE ... -
左移、右移、算术、逻辑
2014-11-10 15:37 0逻辑左移=算数左移,右边统一添0 逻辑右移,左边统一添0 ... -
方法重载
2014-11-04 14:58 0Java编译器的方法特征签 ... -
GPars DataflowQueue,转载自:Groovy
2014-08-15 11:15 0Each message will be read by ex ... -
Oracle官方教程之Fork/Join,转载自:并发编程网
2014-08-06 10:26 712fork/join框架是ExecutorServi ... -
Reactor模式和Proactor模式,转载自:蚂蚁的专栏
2014-07-08 12:27 0首先来看看Reactor模式,Reactor模式应用于同步I/ ... -
Reactor模式及在DSS中的体现,转载自:Mike_Zhang
2014-07-08 11:51 0Reactor模式是处理并发I/O比较常见的一种模式,用于同步 ... -
Reactor模式和NIO
2014-07-08 10:42 0本文可看成是对Doug Lea S ... -
select into和insert into select
2014-04-24 14:02 0Sqlite select into不支持 select I ... -
RSA浅析,部分转载自:Lotus
2014-03-11 13:34 0import java.util.ArrayList; ... -
常量字符串为什么位于静态存储区?转载自:珀尔曼的code之地
2014-03-07 12:08 0char *c="chenxi"; 书上说 ... -
__stdcall,__cdecl,__fastcall,thiscall,naked call
2014-03-04 22:46 0函数调用 被这些修饰关键字修饰的函数,其参数都是从右向左通过堆 ... -
关于lib文件
2014-03-03 12:44 0目前以lib后缀的库有两 ... -
关于_declspec(dllimport)
2014-03-03 12:42 0在Windows DLL编程时,可 ... -
最简单的StackOverflowError
2013-06-28 20:08 0public class Example { priv ... -
越过防火墙
2013-06-21 08:05 0越过防火墙,网站顺利访问 -
逻辑,算术,左移,右移,转载自:Jeff Lee
2013-06-20 11:49 0移位操作要注意的问题是高(低)位是补0还是补1和对char, ... -
How to communicate between thread?
2013-06-02 00:10 0import java.io.DataInputStream; ...
相关推荐
E:\李春葆:数据结构习题与解析(C语言版)\李春葆:数据结构习题与解析(C语言版)\勾月连连看.exeE:\李春葆:数据结构习题与解析(C语言版)\李春葆:数据结构习题与解析(C语言版)\勾月连连看.exeE:\李春葆:...
标题中的“VB制作小游戏 连连看 附:源码”揭示了这是一个关于使用Visual Basic(VB)编程语言开发的小游戏——连连看。连连看是一款经典的休闲益智游戏,玩家需要找出并消除屏幕上的成对相同图案,直到所有图案都被...
《宜清生日快乐连连看——基于VC6.0 GDI技术的连连看游戏开发解析》 在编程领域,连连看是一款深受用户喜爱的经典休闲游戏,它简单易上手,却又富有挑战性。本项目“宜清生日快乐连连看”正是以此为基础,采用古老...
本项目"Python-基于python图像识别实现的连连看自动玩可实现QQ连连看秒破"就是一个很好的实例,它利用Python进行图像识别技术,实现了QQ连连看游戏的自动游玩,甚至可以达到“秒破”的效果。下面我们将深入探讨这个...
MFC连连看 MFC连连看 MFC连连看 MFC连连看 MFC连连看
连连看是一款广受欢迎的休闲游戏,它通过匹配相同图案的方块进行消除,直至清除所有方块或无法再匹配为止。在这个项目中,我们看到一个使用C++编程语言实现的连连看游戏。C++是一种强大的、面向对象的编程语言,非常...
标题中的".NET自己写的游戏 连连看"表明这是一个使用.NET框架开发的个人游戏项目,具体来说是经典的“连连看”游戏。这个项目的核心在于利用.NET的技术实现连连看的逻辑和用户界面,让开发者能够自定义游戏规则和...
在本项目中,我们主要探讨的是使用C++编程语言实现的一款经典游戏——连连看。C++是一种强大且灵活的编程语言,它允许开发者创建高效、可移植的应用程序,包括游戏。在这个C++版的连连看中,我们将关注两个关键方面...
QQ连连看是一款深受玩家喜爱的经典休闲游戏,而“按键精灵”是一种自动化工具,它能够模拟用户的键盘和鼠标操作,极大地提升了工作效率或者游戏体验。在这个场景中,我们将关注的重点放在使用Vbscript(Visual Basic...
2. **窗口类(CWnd)**:游戏主窗口通常继承自CWnd类,负责显示游戏画面、接收用户输入和处理各种消息。开发者需要在此类中定义各种事件处理函数,如鼠标点击、键盘输入等。 3. **控件(CButton, CStatic等)**:在...
在本文中,我们将深入探讨C#编程语言在创建连连看游戏中的应用。连连看是一款流行的休闲益智游戏,玩家需要找到并消除两个相同的图案,直到所有图案都被消除为止。通过学习C#连连看源代码,我们可以了解到游戏的核心...
源码名称:火影连连看 源码版本:V1.00 SWF运行版 源码大小:256KB 源码类型:简体中文/开源软件/免费版 源码类别:AS3 运行环境:Winxp/vista/win7/2000/2003 开发商 :红影界 [闲置技能-技能/资源雇佣平台] ...
C语言期末大作业——成语连连看 大致思路: 1. 定义一个链表数据结构,用于存放不同类型题目的题号。出栈,返回出栈的题号和题目类型 2. 定义一个栈数据结构,用于存放题目顺序 游戏数据: // 定义成语结构体 ...
《连连看》是一款深受大众喜爱的经典消除类游戏,它的核心玩法是通过寻找并连接两个相同图案的方块,使得它们在相连的路径上没有其他方块阻隔,从而达到消除的目的。这款游戏简单易上手,但却具有一定的挑战性和趣味...
【标题】:“连连看小程序源代码(vc++)”指的是使用Microsoft Visual C++(简称VC++)编程环境编写的连连看游戏的源代码。连连看是一款广受欢迎的休闲益智游戏,玩家需要找出并消除屏幕上成对出现的相同图案。 ...
《自己做的连连看》 连连看,这是一款深受大众喜爱的经典消除类游戏,以其简单易上手、趣味性十足的特点,成为了休闲娱乐的好选择。在这个项目中,我们将深入探讨如何制作一个自己的连连看游戏,主要涉及的技术点...
连连看是一款广受欢迎的经典益智游戏,其辅助工具则是为了帮助玩家更轻松地进行游戏而设计的。在本文中,我们将深入探讨连连看辅助的原理、功能以及如何使用。 连连看辅助通常具备以下核心功能: 1. 自动识别:...
《连连看项目——深入探索CocosCreate开发技术》 连连看,一款深受广大玩家喜爱的休闲益智游戏,以其简洁的规则和丰富的挑战性在众多游戏中独树一帜。本项目“连连看”正是基于CocosCreate开发的一款游戏,旨在为...
自己写的一个android上的连连看小游戏,主要是想实现自己之前的一些想法,android第一次接触,写得跌跌撞撞,很糟糕,不想带坏大家,主要是想说下自己的一些对连连看算法的解决思路,应用预览与算法实现请参看以下...
在本项目中,"连连看vc6.0实现"是一个基于Microsoft Visual C++ 6.0(简称VC6.0)开发的经典休闲游戏——连连看的实现。它利用了编程技术来构建游戏逻辑,其中涉及到了两个核心概念:双缓冲技术和连连看算法。 **双...