迷宫设计
更新时间:2023-08-26 13:19:01 阅读量: 教育文库 文档下载
目录
第一节 课程设计的题目及目的 ........................... 1
第二节 课程设计内容和要求 ............................ 1
2.1设计内容 ........................................... 1
2.2设计要求 ........................................... 2
第三节 课程设计方案及分析 ............................ 2
3.1问题分析 ........................................... 2
3.1.1 迷宫的建立 ..................................... 2
3.1.2 迷宫的存储 ..................................... 2
3.1.3 迷宫路径的搜索 .................................. 3
3.1.4 流程图 ......................................... 3
3.2 概要设计 ........................................... 5
3.3 详细设计 ........................................... 5
第四节 源程序 .......................................... 6
第五节 测试结果 ........................................ 10
5.1 错误输入 .......................................... 10
5.2正确路径 .......................................... 10
第六节 课程设计总结 ................................. 11
第七节 参考文献 ........................................ 11
第一节 课程设计的题目及目的
这次课程设计,我们的题目是迷宫求解。迷宫求解是数据结构中的经典问题,我期望达到的目的有四个:
1) 巩固书本知识,对书上的知识能更透彻地了解。
通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。巩
固我们所学的数据结构知识,消化课堂所讲解的内容。也是对所学知识的
一次整理,将原本在我们脑中比较混乱的课程设计重新梳理。
2) 通过课程设计能够更好的掌握迷宫求解中的设计思路为以后灵活运用奠定
基础。
3) 能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告
第二节 课程设计内容和要求 2.1设计内容
迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无
顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫,求出一条从入口到出口的通路,或得出没有通路的结果。
2.2设计要求
(1) 建立一个大小为m×m的任意迷宫(迷宫数据可由用户输入或由程序自动生
成),并在屏幕上显示出来
(2) 在屏幕上输出迷宫和通路
第三节 课程设计方案及分析
3.1问题分析
3.1.1 迷宫的建立
迷宫中存在通路和障碍,为了方便迷宫的创建,可用0表示通路,用1表示障碍,#表示墙壁,这样迷宫就可以用0、1矩阵来描述,
3.1.2 迷宫的存储
迷宫是一个矩形区域,可以使用二维数组表示迷宫,这样迷宫的每一个位置都可 以用其行列号来唯一指定,但是二维数组不能动态定义其大小,我们可以考虑先 定义一个较大的二维数组maze[M+2][M+2],然后用它的前m行m列来存放元素,即可得到一个m×m的二维数组,这样(0,0)表示迷宫入口位置,(m-1,m-1)表示迷宫出口位置。
3.1.3 迷宫路径的搜索
首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路径,搜 索工作结束。否则搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到该位置,然后再从该位置开始搜索通往出口的路径;若是障碍就选择另一个相邻的位置,并从它开始搜索路径。为防止搜索重复出现,则将已搜索过的位置用函数进行判断和标记,同时保留搜索痕迹,在考虑进入下一个位置搜索之前,将当前位置保存在一个队列中,如果所有相邻的非障碍位置均被搜索过,且未找到通往出口的路径,则表明不存在从入口到出口的路径。这实现的是广度优先遍历的算法如果找到路径,则最短路径。
3.1.4 流程图
4
3.2 概要设计
1.①构建一个二维数组maze[M+2][M+2]用于存储迷宫矩阵
②自动或手动生成迷宫,即为二维数组maze[M+2][M+2]赋值
③构建一个队列用于存储迷宫路径
④建立迷宫节点,用于存储迷宫中每个节点的访问情况
⑤实现搜索算法
⑥屏幕上显示操作菜单
2.本程序包含12个函数:
(1)主函数 main()
(2)Status InitStack(); //创建一个空栈S
(3)Status Push(); //插入新元素a
(4)Status Pop();//删除栈顶元素,a返回其值
(5)Status StackEmpty();//检查是否空栈
(6)Status MazePath(); //找通路
(7)void Initmaze(); //初始化迷宫
(8)void printmaze(); //显示迷宫
(9)Status Pass();/判断当前位置是否可通
(10)void Markfoot(); //标记当前位置不可通
(11)PosType NextPos(); //进入下一位置
(12)void printpath(); //显示通路
3.3 详细设计
程序设计的基本思想,原理和算法描述:
此算法最大的优点是支持图形化输入与输出,观察效果好
迷宫求解问题主要运用了堆栈的性质
第四节 源程序
#define M2 12 /*M2*N2为实际使用迷宫数组的大小*/
#define N2 11
#define MAXLEN M2 /*栈的长度*/
#define True 1
#define False 0
# include “stdio.h”
#include<malloc.h>
int M=M2-2, N=N2-2; /*M*N为迷宫的大小*/
typedef struct /*定义栈元素的类型*/
{
int x,y,dir;
}elemtype;
typedef struct /* 定义顺序栈*/
{elemtype stack[MAXLEN];
int top;
}sqstktp;
struct moved /*定义方向位移数组的元素类型对于存储坐标增量的方向位移数组move*/
{
int dx,dy;
};
void inimaze(int maze[][N2]) /*初始化迷宫*/
{ int i,j,num;
for(i=1;i<=M;i++)
{for(j=1;j<=N;j++)
{num=(800*(i+j)+1500) %327; /*根据M和N值产生迷宫*/
if((num<150)&&(i!=M || j!=N))
maze[i][j]=1;
else
maze[i][j]=0;
printf(“%3d”, maze[i][j]); /*显示迷宫*/
}
printf(“\n”);
}
printf(“\n”);
for(i=0,j=0;i<=M+1;i++) /*设置迷宫的边界值*/
maze[i][j]=1;
for(i=0,j=N+1;i<=M+1;i++)
maze[i][j]=1;
for(i=0,j=0;j<=N+1;j++)
maze[i][j]=1;
for(i=M+1,j=0;j<=N+1;i++)
maze[i][j]=1;
} /*inimaze*/
void inimove(struct moved move[]) /*初始化方向位移数组*/
{
/* 依次为东E,东南SE,南S,西南SW,西W,西北NW,北N,东北NE*/. move[0].dx=0; move[0].dy=1;
move[1].dx=1; move[1].dy=1;
move[2].dx=1; move[2].dy=0;
move[3].dx=1; move[3].dy=-1;
move[4].dx=0; move[4].dy=-1;
move[5].dx=-1; move[5].dy= -1;
move[6].dx=-1; move[6].dy=0;
move[7].dx=-1; move[7].dy=1;
}
void inistack(sqstktp *s) /*初始化栈*/
{
s->top= -1;
}
int push(sqstktp *s,elemtype x) /*数据元素x入指针s所指的栈*/
{ if(s->top==MAXLEN-1) /*栈满,返回False */
return(False);
else
{ s->stack[++s->top]=x; /*栈不满,执行入栈操作 */
return(True);
}
}
elemtype pop(sqstktp *s) /*栈顶元素出栈*/
{ elemtype elem;
if (s->top<0) /*如果栈空,返回空值*/
{elem.x = Null;
elem.y = Null;
elem.dir = Null;
return(elem);
}
else
{ s->top- - ;
retrun(s->stack[s->top+1]); /*如果栈不空,返回栈顶元素值*/ }
}
void path(int maze[][N2],struct moved move[],sqstktp *s)
/*寻找迷宫中的一条通路*/
{int i, j, dir, x, y, f;
elemtype elem;
i=1; j=1; dir=0;
maze[1][1] = -1; /*设[1][1]为入口处*/
do
{ x=i+move[dir].dx; /*求下一步可行的到达点的坐标*/ y=j+move[dir].dy;
if(maze[x][y]= =0)
{elem.x = i; elem.y = j; elem.dir = dir;
f=push(s, elem); /*如果可行,将此点数据入栈*/
if(f = =False) /*如果入栈操作返回假,说明栈容量不够*/
printf(栈长度太短\n);
i=x; j=y; dir=0; maze[x][y]= -1; /*走过的位置设为-1 */
}
else
if(dir<7) /*如果当前方向不可行,就转到下一个方向*/
dir++;
else
{elem = pop(s); /*8个方向都不可行,就转到下一个方向*/
if(elem.x!=Null)
{i=elem.x; j=elem.y; dir=elem.dir+1;}
}
}while(!((s->top= = -1)&&(dir>=7)|| (x= =M)&&(y= =N)&&(maze[x][y]= = -1))); /*循环,直到入口处或出口处为止*/
if (s->top= =-1) /*如果是入口处,则迷宫无通路*/
printf(“此迷宫无通路\n”);
else
{ elem.x = x; elem.y = y; elem.dir = dir; /*将最后出口处的坐标压入栈中*/
f= push(s,elem);
printf(“迷宫通路是:\n”);
i= 0;
while (i<=s->top)
{printf(“%d, %d”, s->stack[i].x , s->stack[i].y ); /*显示迷宫通路*/
if (i!=s->top)
printf(“-->”);
if((i+1)%4= =0)
printf(“\n”);
i++;
}
printf(“\n”);
}
}
void draw(int maze[][N2], sqstktp *s) /*在迷宫中绘制出通路*/
{ int i, j;
elemtype elem;
for(i =1; i<=M; i++) /*将迷宫中全部的-1值恢复为0值*/
for(j =1;j<=N; j++)
if (maze[i][j]= = -1)
maze[i][j]= = 0;
while (s->top> -1) /*根据栈中元素的坐标,将通路的各个点的值改为-1*/ {elem = pop(s);
i = elem.x; j = elem.y;
maze[i][j]= = 8;
}
for(i =1; i<=M; i++)
{for(j =1;j<=N; j++)
printf(“%3d”, maze[i][j]);
printf(“\n”);
}
printf(“\n”);
}
void main()
{sqstktp *s;
int maze[M2][N2];
struct moved move[8];
inimaze(maze);
s=(sqstktp *p)malloc(sizeof(sqstktp));
inistack(s);
inimove(move);
path(maze, move, s);
draw(maze,s);
}
第五节 测试结果
5.1 错误输入
5.2正确路径
第六节 课程设计总结
通过这段时间的课程设计,本人对软件专业的应用,数据结构的作用以及C语言的使用都有了更深的了解。尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。
在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。
时间过得真快,大学生活不知不觉就走过了三年,三年的大学学习和课程实践阶段的提高,使我们本身知识得到提高的同时,也增强了我们对未来工作的信心,我们相信自己未来三年的学习更使我们有能力胜任将来的工作。
第七节 参考文献
1. 谭浩强 <<C 程序设计 >>[M]. 北京:清华大学出版社, 2006.
2. 严蔚敏 <<数据结构(C语言版)>>[M]. 北京:清华大学出版社
3. 王华 , 叶爱亮 等 .<<Visual C++6.0 编程实例与技巧 >>[M]. 北京:机械工业出版社
4. 钱新贤 ,程兆炜等 .<<Visual C++ 编程疑难详解>> [M]. 北京:人民邮电出版社,2000.
正在阅读:
迷宫设计08-26
中国人民财产保险股份有限公司通辽市分公司与魏某丙、魏某甲、魏04-11
江西省吉水县白沙中学九年级数学上册 第二章 第3节公式法03-19
计算机网络管理实验二 交换机基本配置10-05
高科技企业税收优惠政策概述及分析07-09
2010-6-B 试卷答案及评分细则06-24
浅析大体积混凝土的温度收缩裂缝控制方法05-14
东北师范大学管理思想史期末考试通过必备真题库及答案5306-04
初二班主任工作总结范本参考04-17
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 迷宫
- 设计
- 第四章 液流型态、水流阻力和水头损失
- 搞笑谐音英语速记
- 大学物理电磁学复习
- 2020年普通高等学校招生全国统一考试语文试题(上海卷,参考版解析)
- 新能源汽车英文资料翻译
- 完整中职哲学与人生教案
- (人教版)七年级下册语文期中考试试题(含答案)
- 第三讲 现代汉语语法研究变换分析法分析
- 不确定优化问题的若干模型与算法研究
- 江苏省苏北四市2015届高三第一次质量检测语文试题 Word版含答案
- 苏教版 用7的乘法口诀求商
- 04年自动控制元件本科期末试题
- USB 插拔测试标准
- 初中科学七年级上册第三章第三节太阳和月球(第1课时)
- 第一章:服务与服务经济
- 2013-2014学年山东省济南外国语学校高一(上)期末化学试卷
- 行政管理学复习资料之简答A (2)
- 起重机械伤害事故事故应急预案
- 冬季防寒、防冻工作安排
- 2010高三地理高考中国地理复习《中国的交通运输业》