老调重提,利用SDK实现迷宫算法

我近来重看了数据结构的书,现在的教材还是使用C/C++的编写的算法,编译还是在console mode进行, 如果能把这些数据结构的算法使用在SDK上,那么就可以开发出 Windows 程序的算法程序提高学习,不用在 单调的console mode 中看着冷冰冰的字符来学习数据结构了,这样学习一方面可以学习调用 Windows API 和 Windows编程,另一方面可以学习数据结构. 希望我这样的学习方法对那些初学 Windows 的朋友有一些帮助.

这是使用 SDK 开发出来的迷宫程序(F1 键开始).


迷宫算法还是老路子,回溯法和堆栈实现,我采用的是堆栈实现. 使用双向链表摸拟堆栈,使用一个 ptrFirst 和一个 ptrLast 和作为堆栈的栈底和栈顶指针, 定义一 个堆栈元素结构, 这个结构保存迷宫中的位置.

typedef struct _tagNode {
  int  nRow;
  int  nColumn;
  struct _tagNode* next;
  struct _tagNode* previou;
} Node;
定义一个标记数组

BOOL bPass[ Row ][ Column ];  // Row 和 Column 为迷宫大小.迷宫算法的主要伪代码的实现方式.

A.从开始位置开始,判断小球的各个方向是否可行,若一个方向可行,则向该方向移动.

前进的位置进栈.

条件: 前进方向是墙, 则该方向不能向前.

前进和方向如果是经过的,则该方向不能向前.

if ( CanMove( gnRow, gnColumn, right ) )
   {
     gnColumn += moveRight; // 前进
     bPass[ gnRow ][ gnColumn ] = TRUE; // 标记通过的位置
     // gnRow, gnColumn 位置入栈.
   }
   else if ( CanMove( gnRow, gnColumn, left ) ) // right 方不通, 向左.
   {
     gnColumn += moveLeft; // 前进
     bPass[ gnRow ][ gnColumn ] = TRUE; // 标记通过的位置
     // gnRow, gnColumn 位置入栈.
   }
   else if ( CanMove( gnRow, gnColumn, forward ) ) // left 方不通, 向前.
   {
     gnColumn += moveForward; // 前进
     bPass[ gnRow ][ gnColumn ] = TRUE; // 标记通过的位置
     // gnRow, gnColumn 位置入栈.
   }
   else if ( CanMove( gnRow, gnColumn, back ) ) // forward 方不通, 向后.
   {
     gnColumn += moveBack; // 前进
     bPass[ gnRow ][ gnColumn ] = TRUE; // 标记通过的位置
     // gnRow, gnColumn 位置入栈.
   }
B.各个方向不能可行,退回前一个位置,利用退栈操作,回到 A.

else if ( CanMove( gnRow, gnColumn, back ) )
   {}
A, B 不断重复, 直到找到出口, 或遍历迷宫(栈空)

if 为迷宫出口
     bSearch = FALSE;
   if 栈为空 // 没有出口,
     bSearch = FALSE;

时间: 2024-11-08 19:26:51

老调重提,利用SDK实现迷宫算法的相关文章

老调重提,面向对象技术在SDK中的应用

这次写这篇文章,还是重复我上两篇的写作风格,(数据结构篇"老调重提,利用SDK实现迷宫算法",算法篇,"老调重提,利用SDK实现五子棋"),而现在这篇则是面向对象技术篇,当然还是老调重提!不过我们是利用面向对象技术实现Windows的SDK开发,对于刚开始学习Win32 SDK的VcKbase的朋友们,你们一定可以在此获益! 这次,我会利用面向对象技术实现对Windows窗口的封装! 刚开始编写SDK的程序的时候,都需要写重复的代码,注册窗口类( RegisterW

利用SDK实现智能五子棋

网上有很多的实现五子棋的算法,如利用规则法,递归法,博弈树法来实现五子棋的,上次我写了一篇利用SDK实现迷宫算法的文章--"老调重提,利用 SDK 实现迷宫算法",这次还是同样的题目,老调重提,我利用的是规则法来实现五子棋的智能.不过我个人认为还是博弈树法还是简洁.如果读者对博弈树有兴趣的,可以重读数据结构中的树结构的实现这一部分! 这是利用SDK实现的五子棋程序运行界面: 这里我讲出我实现的思路: 第一步,计算出一个棋盘的五子棋的所有胜利组合. 第二步,计算出玩家的下棋状态,电脑将会

微博 图片分享 压缩-利用微博分享图片的压缩问题

问题描述 利用微博分享图片的压缩问题 请求大家,我在做毕业设计,关于信息隐藏的,但是隐蔽信息嵌入图片分享到微博后总是自动压缩,有没有这方面开发经验的?利用SDk啥的消除压缩? 解决方案 那估计是你的信息本身就比较多,你弄个分辨率低一点的图片试试

移动互联网趋势是App还是Web?看看百度和UC的动向吧

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 把这两家放在一起说,无关老掉牙的并购"绯闻",而是因为它们是国内互联网企业中,唯二非常重视移动Web端的玩家--UC浏览器是HTML语言的解析工具,而百度搜索则是链接的重组排序. 因此在App vs. Web仍争论不休的大背景中,这两家公司的态度将很大程度上决定国内移动互联网市场针对这场辩论的站队走向. 但截止目前的结果,可能会让热衷"只能活一个"角斗士逻辑的看客们有些失望,因为这两家公司给出的答案似乎都是:别

不使用VS.NET集成开发环境,调用微软的WebService注册服务

web|微软 微软最近在http://210.77.155.240/regBeta2/regservice.asmx 开放了一个WebService注册服务,通过它注册你的VS.NET Beta2,有机会得到代微软标记的单脚滑板. 如果通过VS.NET Beta2集成开发环境,来编写一个WebService客户程序调用此服务会很简单,但是我可以上网的地方机器的配置太低,无法安装VS.NET,只装了一个.NET Framework SDK Beta2,我只好试着用SDK方式来调用了.具体的实现步骤

CUDA内存访问(一)提高篇------按部就班 ------GPU的革命

谈到内存的访问,其实也就是几个API函数的调用,感觉也没什么好讲的,知道cudaMalloc,知道cudaMemcpy,还有cudaFree,就应该可以对device上的内存进行分配,然后就可以在device上使用内存.但是就像我们看运动会一样,只看100米的那不到10秒的时间,也许你只会说,他跑得真快.又有多少人能清楚其过程中的磨炼啦?要真正理解device上内存的调度访问,让我们的程序达到更快的速度,就得对内存访问的情况做更深入的了解,明白其中的过程. 我记得大学刚开始上编程语言的课程的时候

轻松入门Android直播相关技术 从0搭建直播系统

本文讲的是轻松入门Android直播相关技术 从0搭建直播系统,我立马实践了下,所以首先给大家分享下整个搭建的流程: 本人的操作系统为mac,其他系统的同学可以根据提示,自行安装软件. 一个简易的直播系统,大致可以由三部分组成: 搭建一个rtmp媒体服务器 推流端 拉流端 现在目标是快速搭建起来,所以当然是借助开源项目和一些软件: rtmp媒体服务器:这里使用srs 推流端:这里使用obs 拉流端:这里使用播放器vlc rtmp媒体服务器的搭建 这里使用srs,srs的链接为: https://

Android--百度地图之基础地图(三)

开发者可利用SDK提供的接口,使用百度为您提供的基础地图数据.目前百度地图SDK所提供的地图等级为3-21级,所包含的信息有建筑物.道路.河流.学校.公园等内容. V3.7.0起,地图支持缩放至21级,暂不支持卫星图.热力图.交通路况图层的21级显示,打开以上类型图层,地图会自动缩放到20级. 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物.如标注.矢量图形元素(包括:折线.多边形和圆等).定位图标等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动. 百度地图SDK为广大开发

在Eclipse添加Android兼容包( v4、v7 appcompat )

昨天添加Android兼容包,碰到了很多问题,在这里记录一下,让后面的路好走. 如何选择兼容包, 请参考Android Support Library Features(二) 一.下载Support Library 方法1:右击项目→选择Android Tools→Add Support Library- 方法2: 通过SDK Manager获取Support Library: 1.打开Android SDK Manager 2.在SDK Manager窗口,滚动到Package List的末尾