- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
迷宫问题求解
设计题目: 迷 宫 问 题 求 解
班 级 : 计科一班
学 号 : 222011321210151 (檀国林)
222011321210137 (蒲德垣)
222011321210169 (谢 甜)
222011321210116 (陈 甫)
完成日期: 2013/04/20
小组分工情况:
檀国林负责整个递归算法求解迷宫的分析及实现,谢甜跟蒲德垣负责非递归算法求解迷宫分析及实现,实验报告由谢甜跟檀国林共同完成。
打分:檀国林 86 B
蒲德垣 75 C
谢甜 95 A
陈甫 65 D
实验目的和要求
实践用“穷举求解”(回溯)方法求解迷宫问题;
掌握的栈的操作方法;
编写实验报告;
实验内容
1. 用“穷举求解”(回溯)方法求解迷宫问题
2. 用递归遍历的方法求解迷宫问题
实验步骤
问题分析
1.1用递归算法求解迷宫
计算机解迷宫时,通常用的是“穷举求解”的方法。
即从入口出发,顺某一方向(逆时针方向)向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路返回,显然需要用一个先进后出的结构来保存从入口到当前位置的路径。
其中的关键问题如下:
表示迷宫的数据结构
typedef int Status;
typedef struct{ //坐标点结构体
int y; //每个可通的行坐标
int x; //每个可通的列坐标
}PosType;
typedef struct{
int ord; //通道块在路径上的序号
int di; //从此通道块走向下一通道块的方向
PosType seat; //通道块在迷宫中的坐标位置
}MazeNode; //迷宫节点
typedef struct{ //用于存储迷宫的路径
PosType coor[INITSIZE];
int top;
}Postion;
试探方向
?走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、南、西、北、四个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果某方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。?
栈的设计
int InitStack(Stack *); //初始化栈
int InitStack1(Postion *);
int StackEmpty(Stack *); //判断栈是否为空
int StackEmpty1(Postion *);
int StackIsFull(Stack *); //判断栈是否满了
int StackIsFull1(Postion *); //判断栈是否满了
int Push(Stack *s,MazeNode m); //压栈
int Push1(Postion *,PosType);
int Pop(Stack *s,MazeNode *m); //出栈
int Pop1(Postion *,PosType *);
int DestroyStack(Stack *s); //撤销栈
防止重复到达某点,避免发生死循环
通过对已经访问过的点做标记,可以有效的防止重复的访问某一点,避免出现死循环,同时能够提高算法执行的效率。
1.2用递归算法求解迷宫
用递归算法求解迷宫的关键是编写求解迷宫的递归函数。在递归函数中,每次访问了结点就将其位置上的数置为-1作为标记,表示当前结点可走且已经走过。接下来看当前结点是否是终点,如果是终点则打印当前所走过的迷宫轨迹,否则继续按顺时针方向试探下一步。最后,在递归函数退出前要让先前所走过的标记要恢复为初始状态,以免干扰后面递归函数执行时混淆。
问题求解
文档评论(0)