- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
案例十九老鼠钻迷宫资料
案例十九 老鼠钻迷宫 本案例知识要点 二维数组的使用 堆栈的使用 链表的使用 类的设计和使用 一、案例需求 案例描述 有一个迷宫,只有一个入口和一个出口,有一只小老鼠想从迷宫的入口穿越迷宫走到出口。要求编程实现迷宫以及老鼠穿越迷宫的动态过程。 案例效果图 案例效果如图所示。 老鼠钻迷宫案例效果图 功能说明 迷宫使用随机函数生成。在屏幕上用了18行?70列来绘制迷宫,分别用“^”表示当前老鼠所在位置、“=”表示走过的无用的路、“+”表示走过的有用的路、“ ”(空格)表示路、“*”表示墙;以第2行第1列为老鼠初始位置,以第17行第70列为老鼠出口,如老鼠最终能从第2行第1列走到第17行第70列,则表示老鼠钻迷宫成功。 提供不同的钻迷宫速度:1表示快速;2表示慢速。 程序结束后显示钻迷宫结果:显示成功或失败提示,如果成功则显示走过的步数和有用步数。 二、案例分析 首先分析如何模拟一个迷宫,即采用何种数据结构来存储和表示迷宫。可以用一个二维数组来模拟迷宫,在数组中用不同的字符来表示“通道”和“墙”。通过将这个数组动态地显示在屏幕上,可以看到由“通道”和“墙”组成的迷宫,以及在迷宫中奔跑的“小老鼠”。 采用随机函数的方法生成这个二维数组,即随机生成“墙”和“通道”。 然后解决钻迷宫的算法,先从老鼠所在的位置开始探索。假设开始是在A点位置,从A点“上”、“下”、“左”、“右”4个方向可能的通道中随机选择一个开始前进一步到B点,如果在B点的4个方向上,除了从A点过来的这个方向之外的其他3个方向还有通道,那么就从B点开始重新探索,如果B点是个死胡同,则后退到A点,并将A到B的这个方向标记为“不通”。然后重新选择A点的其他的方向。走到新的点后,再重新开始这个判断过程。也就是需要将小老鼠走过的每一步都记载下来,遇到死胡同的时候,就要后退一步,退到刚刚走过的位置选择其他的方向再次开始,直到小老鼠走到了出口。 “存储走过的点→退到最近走过的点”是一个典型的堆栈结构,即把小老鼠走过的节点按照走过的顺序压入堆栈。若遇到死胡同,则最近走过的点就在栈顶,可以直接出栈。 一般来说,对堆栈的存储有两种方式,即数组和链表,数组方式一般是在能够预先知道堆栈深度的情况下采用,以便定义数组。而链表在内存的占用方法灵活高效,本案例适合采用链表的方式来存储堆栈。 三、案例设计 类的设计 基于上述分析,本案例需要自定义一些全局常量,定义一个结构体SNode,同时需要设计一个类Stack。类Stack用来处理入栈(将老鼠的成功步压栈)、出栈(老鼠走入死胡同,弹出栈顶步,从老鼠的上一个位置开始继续向后探索)、判栈空等操作。 (3)Stack类的设计 ① 数据成员 int totallength; 用来记载栈操作次数。 int length; 用来记载栈深度。 SNode *top; 设置栈顶指针。 ② 函数成员 Stack(); 构造函数,用来进行初始化工作。栈顶指针置空,栈深度 和栈操作次数清零。 int Pop(); 反悔一步则进行出栈操作,返回栈顶元素。 int Push(int e); 如果是有效步则进行入栈操作,将元素e压栈。e代表老鼠 本步走的方向,有上、下、左、右4个方向。 int IsEmpty(); 判断栈是否为空,栈为空则返回OK,否则返回ERROR。 2.主程序设计 (1)全局变量 char arr[18][70]; 定义存储迷宫用的字符型二维数组。 (2)函数设计 void InitMaze() 迷宫初始化函数,该函数用于设置18?70的二维数组arr的每一个元素的值。通过给某行某列的元素赋予字符“*”表示迷宫的墙,赋予空格字符“ ”表示迷宫的通道。其中 18行?70列的迷宫图中第一行、最后一行、第一列(除外第一列第二行的位置以外)、最后一列(除第70列第17行的位置以外)规定为墙,第2行第1列规定为迷宫入口,第17行第80列规定为迷宫出口。为了减少死通道过多的缺陷,第2行第2列~第2行第4列规定为通道,第17行第67列~第17行第69列规定为迷宫通道。 void ShowMaze() 利用迷宫初始化函数InitMaze()中设置的二维数组arr的值来绘制18行?70列的迷宫图。其中:“*”表示墙;“^”表示老鼠;“ ”(空格)表示路;“+”表示有用的路;“=”表示无用的路。 (3)主函数设计 void main() 在主函数中定义了一个用于存储老鼠走过的路线的栈s。首先初始化迷宫,显示迷宫图
您可能关注的文档
- 标志设计简介.ppt
- 标本考试简介.ppt
- 标本采集技术x简介.pptx
- 标本采集简介.ppt
- 标杆房地产企业薪酬体系简介.ppt
- 标点符号之高考试题简介.ppt
- 标汇报简介.pptx
- 标识技术《物联网技术基础教程》简介.ppt
- 栈和队列课件.ppt
- 栎枯萎病菌讲述.ppt
- 数据仓库:Redshift:Redshift与BI工具集成.docx
- 数据仓库:Redshift:数据仓库原理与设计.docx
- 数据仓库:Snowflake:数据仓库成本控制与Snowflake定价策略.docx
- 大数据基础:大数据概述:大数据处理框架MapReduce.docx
- 实时计算:GoogleDataflow服务架构解析.docx
- 分布式存储系统:HDFS与MapReduce集成教程.docx
- 实时计算:Azure Stream Analytics:数据流窗口与聚合操作.docx
- 实时计算:Kafka Streams:Kafka Streams架构与原理.docx
- 实时计算:Kafka Streams:Kafka Streams连接器开发与使用.docx
- 数据仓库:BigQuery:BigQuery数据分区与索引优化.docx
文档评论(0)