三九宝宝网宝宝教育学龄段教育

C设计一个迷宫并走出来

02月16日 编辑 39baobao.com

[浅谈新青年教师如何走出初为人师的迷茫]一、重新找准自身角色定位 作为一名新教师,一定要反复提醒自己,大学校园里的各种荣誉都成为了历史,现在自己在教学的各个方面都是新手,甚至是低手,没有教学经验,没有教学业绩。因...+阅读

本程序的前提是将迷宫保存在一个二维数组里,可走的地方为0,不可走的地方为1。由于采用回朔算法,不使用递归,所以首先应该建立一个栈来保存路径,路径是用一个一个点来表示的,也就是说栈中保存的是一系列点的列表。 栈节点类型说明: struct StackNode { POINT Point; struct StackNode *Next, *Prev;//双向链表形式 }; 栈结构用一个类(CPointStack)实现,声明如下: class CPointStack { public: void ClearStack();//清空栈 void InitStack();//初始化栈 bool Pop(POINT &pt);//弹出顶端元素,并给出该点的坐标,返回是否弹出成功 bool Push(POINT pt);//将pt点的信息压入栈,返回是否压入成功 CPointStack(); virtual ~CPointStack(); protected: StackNode *m_psnTop;//栈顶指针 StackNode m_snBottom;//栈底,不保存点信息 }; 以下为成员函数实现,都是一些数据结构的操作,应该没什么好说的: //构造时初始化栈 CPointStack::CPointStack() { InitStack(); } //析构时清空栈 CPointStack::~CPointStack() { ClearStack(); } //将点压入栈(成功返回true,失败返回false) bool CPointStack::Push(POINT pt) { StackNode* NewNode = new StackNode; //是否返回true主要看这里申请内存是否成功 if(!NewNode) return false; NewNode->Point = pt; NewNode->Prev = m_psnTop; NewNode->Next = NULL; m_psnTop->Next = NewNode; m_psnTop = NewNode; return true; } //将点弹出栈(成功返回true,栈为空则返回false) bool CPointStack::Pop(POINT &pt) { if(m_psnTop == &m_snBottom)//是否返回true主要看这里栈是否为空 return false; StackNode *p; p = m_psnTop; m_psnTop = m_psnTop->Prev; pt = p->Point; delete p; m_psnTop->Next = NULL; return true; } //初始化栈 void CPointStack::InitStack() { m_psnTop = &m_snBottom; m_snBottom.Next = NULL; m_snBottom.Prev = NULL; } //清空栈 void CPointStack::ClearStack() { StackNode *p; while(m_psnTop != &m_snBottom) { p = m_psnTop; m_psnTop = m_psnTop->Prev; delete p; } } 接下来设计怎样走出这个迷宫,也就是迷宫算法的主体部分。再次用一个类实现。 在设计这个类时,我考虑到以下几点:

1、迷宫入口和出口的坐标

2、保存迷宫的2维数组

3、获得路径的函数 但是实际设计时由于没有考虑太多问题,只是以设计迷宫算法和解决一个具体迷宫为目的,所以没有考虑动态大小的迷宫,而是将迷宫大小定为601*401。而且在设计迷宫算法后没有将路径顺序输出而是直接在原图中标识(在保存迷宫数据的表中设置经过的点为2而将死路点设置为3)。 这样迷宫类(CGoMaze)的声明为: class CGoMaze { public: void Go();//寻找路径的函数 POINT m_ptIn;//入口坐标 POINT m_ptOut;//出口坐标 BYTE m_btArrMaze[401][601];//保存迷宫的二维表 CGoMaze(); virtual ~CGoMaze(); }; 最后让我们来看一下CGoMaze::Go()这个函数: 我们模仿人走迷宫时的思路,设置一个当前点,一个目标点(下一个要走的点)。初始情况下当前点为入口,终止条件为当前点为出口,这样,我们的函数大概结构就出来了。 在从入口到出口的过程中程序对当前点的上、下、左、右四个点依次进行判断,当发现任一个方向是未走过的区域时,就将当前点指向那个点进行尝试,同时将当前点入栈并做标记。而当4个方向都不通或已走过时,则为死路,标记当前点为死路并从栈中弹出上一个点继续进行尝试,这时因为当前点已被标记为死路,则弹出上一个点时就不会重复这条路,达到寻找正确路径的效果。 Go函数的具体实现如下,其实挺简单的^_^: void CGoMaze::Go() { CPointStack psPath;//保存路径的栈 POINT ptCur = m_ptIn, ptNext;//设置当前点为入口 while(ptCur.x != m_ptOut.x || ptCur.y != m_ptOut.y)//判断是否已经走出 { ptNext = ptCur;//设置目标点为当前点,便于下面偏移 if(m_btArrMaze[ptCur.y - 1][ptCur.x] == 0) ptNext.y --;//如果上方是空的,则目标点向上偏移 else if(m_btArrMaze[ptCur.y][ptCur.x - 1] == 0) ptNext.x --;//如果左边是空的,则目标点向左偏移 else if(m_btArrMaze[ptCur.y + 1][ptCur.x] == 0) ptNext.y ++;//如果下方是空的,则目标点向下偏移 else if(m_btArrMaze[ptCur.y][ptCur.x + 1] == 0) ptNext.x ++;//如果右边是空的,则目标点向右偏移 else {//这里是没有路的状态 m_btArrMaze[ptCur.y][ptCur.x] = 3;//标记为死路 psPath.Pop(ptCur);//弹出上一次的点 continue;//继续循环 } //如果有路的话会执行到这里 m_btArrMaze[ptCur.y][ptCur.x] = 2;//标记当前点为路径上的点 psPath.Push(ptCur);//当前点压入栈中 ptCur = ptNext;//移动当前点 } } 其实这个部分可以将栈设置为CGoMaze类的成员,然后在Go函数里加上: psPath.ClearStack(); 这样就可以用Timer来演示走迷宫的过程了

以下为关联文档:

如何走出农村中学语文作文教学的困境写出令人满意的作文呢?因此,大力加强学生的课外阅读是农村中学作文教学的当务之急。怎样才能加强学生的课外阅读呢? 首先,创设班级阅览室。我发动并组织学生广泛征订有关写作方...

如何实施转型发展走出资源型经济困境促进就业稳定职工队伍我就谈谈,企业如何进行互联网转型吧(全)。整个四维度三步骤互联网转型方法论结合企业转型中会遇到的实际问题提出解决方案,干货。 面向互联网+的转型,大部分传统企业目前处在两种...

专家谈如何走出学生减负困局但当家长们说这句话的时候,可曾思考过,孩子起跑后,究竟要跑向何方?当家长们以“为孩子好”,“不耽误孩子”为名,给孩子背负上各种各样压力的时候,是否应当首先想清楚这个本原的问题...

怎么从这段纠结的感情走出你猜错了,我不会让你马上放弃,我让你调整心态。因为我看你在文中说“因为付出得太多,所以陷得太深,无法抽离出来”。我想如果你要平息自己撕心裂肺,心冷如冰的感情的话,首先你要明...

家长在给孩子先择幼儿园时应走出哪些误区1. 不顾路途远,不怕价格高,想办法进一级一类幼儿园。国家依据幼儿园的规模,设施,管理水平,师资水平,保教质量,卫生保健全面评估将幼儿园划分为一级一类,一级二类,二级一类等。一级一...

奢侈品行业迎来寒冬如何走出困境首先,从宏观上来说,国家政策理应有些转变。国家需要内需,何为内需?顾名思义拉动国内消费。目前整个奢侈品行业国人消费最盛,据2014年数据显示,国人奢侈品消费占全球46%,而国外消费...

C课程设计迷宫急给出详细的我看了一下上一个回答,编的还不错,但是有漏洞,同时不能自己改动设计迷宫样式,我又完善了一下,可以自己设计迷宫的样式,同时操作能漂亮点!!!希望能帮上你!! 注意 数组大小为 a[10][20]...

c语言的课程设计:迷宫问题参考一下这个/*4.3.3源程序*/#include#include#include#include#include#define N 20/*迷宫的大小,可改变*/int oldmap[N][N];/*递归用的数组,用全局变量节约时间*/int yes=0;/...

c程序设计迷宫这个可行的/*4.3.3源程序*/#include#include#include#include#include#define N 20/*迷宫的大小,可改变*/int oldmap[N][N];/*递归用的数组,用全局变量节约时间*/int yes=0;/*y...

推荐阅读
图文推荐