迷宫与栈问题课程设计报告

合集下载

数据结构课程设计――迷宫问题课程设计报告

数据结构课程设计――迷宫问题课程设计报告

数据结构课程设计――迷宫问题课程设计报告迷宫问题——王欣歆20080564一(需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。

二(概要设计:存储结构:采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。

/*八个方向的数组表示形式*/int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1, 1}};/*用结构体表示位置*/struct position{int x,y;};position stack[m*m+1];基本算法:走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。

每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。

用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。

迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。

设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。

二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。

假设当前所在位置是(x,y)。

沿某个方向前进一步,它可能到达的位置最多有8个。

如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进y 一步,可能到达的新位置坐标可利用move数组确定: o x=x+move[i][0]y=y+move[i][1]从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。

栈与迷宫的课程设计

栈与迷宫的课程设计

栈与迷宫的课程设计一、课程目标知识目标:1. 让学生理解栈的数据结构特点及其在实际问题中的应用;2. 使学生掌握使用栈解决迷宫问题的方法,包括迷宫的生成和路径寻找;3. 帮助学生建立栈与递归思想之间的联系,理解递归在解决迷宫问题中的作用。

技能目标:1. 培养学生运用栈解决实际问题的能力,特别是迷宫问题;2. 提高学生编写和调试解决迷宫问题的程序的能力;3. 引导学生通过小组合作,培养团队协作和问题解决技巧。

情感态度价值观目标:1. 激发学生对计算机科学和编程的兴趣,增强其学习动力;2. 培养学生面对复杂问题时保持耐心、细心的态度,勇于尝试和不断优化的精神;3. 增强学生的自信心,使其相信自己能够通过所学知识解决实际问题。

课程性质分析:本课程为中学信息技术或计算机科学相关课程,适用于有一定编程基础的学生。

通过结合栈与迷宫问题,使学生将理论知识应用于实践,提高解决问题的能力。

学生特点分析:考虑到学生年级和已有知识水平,课程设计将注重理论与实践相结合,逐步引导学生从简单到复杂的问题解决过程。

教学要求:1. 课程应注重启发式教学,引导学生主动探索和发现;2. 教师应关注学生个体差异,提供个性化指导;3. 教学过程中要充分体现学生的主体地位,鼓励学生积极参与讨论和分享。

二、教学内容1. 栈的基本概念与操作:回顾栈的定义、特点,掌握栈的出栈、入栈、栈空、栈满等基本操作。

相关教材章节:第二章 数据结构 第二节 栈与队列2. 迷宫问题分析:介绍迷宫问题的背景,分析问题解决的步骤,包括迷宫的表示、路径寻找等。

相关教材章节:第四章 算法应用 第三节 迷宫问题3. 栈在迷宫问题中的应用:讲解如何利用栈存储路径信息,解决迷宫问题。

相关教材章节:第四章 算法应用 第四节 栈与迷宫4. 递归思想与迷宫问题:介绍递归思想在解决迷宫问题中的应用,使学生理解递归的本质。

相关教材章节:第五章 递归算法 第二节 递归迷宫问题5. 编程实践:结合所学知识,编写解决迷宫问题的程序,进行调试和优化。

数据结构课程设计报告-迷宫算法

数据结构课程设计报告-迷宫算法

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:迷宫算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (3)2.2.1 功能模块图 (3)2.2.2 流程图分析 (4)3 数据结构分析 (8)3.1存储结构 (8)3.2算法描述 (8)4 调试与分析 (11)4.1调试过程 (11)4.2程序执行过程 (11)参考文献 (15)附录(关键部分程序清单) (16)1 课程设计介绍1.1 课程设计内容编写算法能够生成迷宫,并且求解迷宫路径(求解出任意一条到出口的路径即可):1.迷宫用上下左右四种走法;2.迷宫的大小和复杂程度可以由用户定义;3.入口出口也由用户自己选择。

1.2 课程设计要求1.不必演示求解过程,只需要输出迷宫求解的路径;2.参考相应资料完成课设。

2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为四大模块。

以下是四个模块的大体分析:1 建立迷宫:要建立迷宫首先就要建立存储结构,这里我用栈的方式建立的。

根据用户输入的迷宫的大小(我设置的最大值为25可以根据要求调解);2 设置迷宫:这里将0设置围墙,1是可以通过的路径,-1是不可以通过路径,外墙是以设计好的,内墙需要用户来设置,障碍的难度可由用户自行定义;3 寻找路径:寻找路径我设置了四个方向{0,1},{1,0},{0,-1},{-1,0}移动方向,依次为东南西北,首先向东走,若不成功则转换方向,成功则继续前进,将走过的路径进行标记,然后存入栈中;4 输出结果:输出的结果分为两种,一种是用户建立的迷宫主要是让用户检查是否符合要求,第二种输出的是寻找完后的路径,路径用1 2 3 4···来表示。

数据结构毕业课程设计报告—迷宫求解问题

数据结构毕业课程设计报告—迷宫求解问题

课题设计1:迷宫求解一. 需求分析:本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。

首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序。

二、概要设计:1.抽象数据类型定义:ADT Find{数据对象:D={ai?ai ∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<ai-1,ai>?ai-1, ai∈D }基本操作:find (&S)初始条件:已初始化栈S,且栈为空操作结果:从栈S中找出相对应的数据关系,并输出结果}ADT Find2. 主程序的流程以及各程序模块之间的调用关系:(1).定义变量i、j、w、z为整形变量(2).输入迷宫二维数组maze(0:m,0:n)(3).调用子程序find ()(4).结束程序三、相应的源程序如下:#include<stdio.h>#include<stdlib.h>typedef enum { ERROR, OK } Status;typedef struct{int row, line;}PosType;typedef struct{int di, ord;PosType seat;}SElemType;typedef struct{SElemType * base;SElemType * top;int stacksize;}SqStack;Status InitStack(SqStack &S);Status Push(SqStack &S,SElemType &a);Status Pop(SqStack &S,SElemType &a);Status StackEmpty(SqStack S);Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end);void Initmaze(int maze[12][12],int size);void printmaze(int maze[12][12],int size);Status Pass(int maze[12][12],PosType CurPos);void Markfoot(int maze[12][12], PosType CurPos);PosType NextPos(PosType CurPos, int Dir);void printpath(int maze[12][12],SqStack S,int size);void main (void){SqStack S;int size,maze[12][12];for(int n=0;n<10;n++){printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于50):\n");scanf("%d",&size);if(size<1 || size>10){printf("输入错误!");return;}Initmaze(maze,size);printmaze(maze,size);PosType start,end;printf("输入入口行坐标和列坐标:");scanf("%d",&start.row);scanf("%d",&start.line);printf("输入出口行坐标和列坐标:");scanf("%d",&end.row);scanf("%d",&end.line);if(MazePath(maze,S,start,end))printpath(maze,S,size);else printf("找不到通路!\n\n");}}Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end){PosType curpos;int curstep;SElemType e;InitStack(S);curpos = start;curstep = 1;do {if (Pass(maze,curpos)){Markfoot(maze,curpos);e.di =1;e.ord = curstep;e.seat= curpos;Push(S,e);if (curpos.row==end.row && curpos.line==end.line)return OK;curpos = NextPos(curpos, 1);curstep++;}else{if (!StackEmpty(S)){Pop(S,e);while (e.di==4 && !StackEmpty(S)) {Markfoot(maze,e.seat);Pop(S,e);}if (e.di<4){e.di++;Push(S, e);curpos = NextPos(e.seat, e.di);}}}} while (!StackEmpty(S));return ERROR;}void Initmaze(int maze[12][12],int size){char select;printf("选择创建方式A:自动生成B:手动创建\n");label:scanf("%c",&select);if(select=='a'||select=='A'){for(int i=0;i<size+2;i++)maze[0][i]=1;for( i=1;i<size+1;i++){maze[i][0]=1;for(int j=1;j<size+1;j++)maze[i][j]=rand()%2;maze[i][size+1]=1;}for(i=0;i<size+2;i++)maze[size+1][i]=1;}else if(select=='b'||select=='B'){printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n",size,size);for(int i=0;i<size+2;i++)maze[0][i]=1;for( i=1;i<size+1;i++){maze[i][0]=1;for(int j=1;j<size+1;j++)scanf("%d",&maze[i][j]);maze[i][size+1]=1;}for(i=0;i<size+2;i++)maze[size+1][i]=1;}else if(select=='\n')goto label;else printf("输入错误!");}void printmaze(int maze[12][12],int size){printf("\n\n");printf("显示所建的迷宫(#表示外面的墙):\n");for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");for(i=1;i<size+1;i++){printf("%c ",'#');for(int j=1;j<size+1;j++){printf("%d ",maze[i][j]);}printf("%c",'#');printf("\n");}for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n");}void printpath(int maze[12][12],SqStack S,int size){printf("\n\n通路路径为:\n");SElemType * p=S.base;while(p!=S.top){maze[p->seat.row][p->seat.line]=2;p++;}for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");for(i=1;i<size+1;i++){printf("%c ",'#');for(int j=1;j<size+1;j++){if(maze[i][j]==2) printf("%c ",'0');else printf(" ");}printf("%c",'#');printf("\n");}for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n\n"); }Status Pass(int maze[12][12],PosType CurPos){if (maze[CurPos.row][CurPos.line]==0)return OK;else return ERROR;}void Markfoot(int maze[12][12],PosType CurPos){maze[CurPos.row][CurPos.line]=1;}PosType NextPos(PosType CurPos, int Dir){PosType ReturnPos;switch (Dir){case 1:ReturnPos.row=CurPos.row;ReturnPos.line=CurPos.line+1;break;case 2:ReturnPos.row=CurPos.row+1;ReturnPos.line=CurPos.line;break;case 3:ReturnPos.row=CurPos.row;ReturnPos.line=CurPos.line-1;break;case 4:ReturnPos.row=CurPos.row-1;ReturnPos.line=CurPos.line;break;}return ReturnPos;}Status InitStack(SqStack &S){S.base=(SElemType *)malloc(100*sizeof(SElemType));if(!S.base)return ERROR;S.top=S.base;S.stacksize=100;return OK;}Status Push(SqStack &S,SElemType &a){*S.top++=a;return OK;}Status Pop(SqStack &S,SElemType &a){if(S.top==S.base)return ERROR;a=*--S.top;return OK;}Status StackEmpty(SqStack S){if(S.top==S.base)return OK;return ERROR;}以下为测试数据:输入一个矩阵,例如:1 0 0 1 10 0 1 1 11 0 0 0 10 1 0 1 11 1 0 0 0输入入口行坐标和列坐标:1 2输入出口行坐标和列坐标:5 5通路路径为:课题设计3:joseph环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

迷宫与栈问题课程设计报告

迷宫与栈问题课程设计报告

二、课程设计内容(含技术指标)【问题描述】以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

【任务要求】首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出。

其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。

编写递归形式的算法,求得迷宫中所有可能的通路。

以方阵形式输出迷宫及其通路。

【测试数据】迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。

出口出口四、基本要求1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。

若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。

2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。

3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。

设计报告以规定格式的电子文档书写、打印并装订,报告格式严格按照模板要求撰写,排版及图、表要清楚、工整。

从总体来说,所设计的程序应该全部符合要求,问题模型、求解算法以及存储结构清晰;具有友好、清晰的界面;设计要包括所需要的辅助程序,如必要的数据输入、输出、显示和错误检测功能;操作使用要简便;程序的整体结构及局部结构要合理;设计报告要符合规范。

课程负责人签名:2011年7月1日迷宫与栈问题摘要数据结构是研究与数据之间的关系,是互相之间一种或多种特定关系的数据元素的集合,我们称这一关系为数据的逻辑结构。

数据结构在计算机的表示(又称映像)称为数据的物理结构,又称存储结构。

本次课程设计是迷宫求解问题,主要是模拟从入口到出口的通路。

程序中的数据采取的是“栈”作为数据的逻辑结构,并且使用链式存储结构,即是实现一个以链表作存储结构的栈类型。

c课程设计报告迷宫

c课程设计报告迷宫

c 课程设计报告迷宫一、教学目标本课程的教学目标是让学生掌握迷宫问题的基本概念、算法和编程技巧。

通过本课程的学习,学生应能理解迷宫问题的数学模型,掌握常用的迷宫算法,并能够运用编程语言实现迷宫的求解。

此外,学生还应培养解决问题的能力和创新思维,提高对计算机科学和编程的兴趣。

具体来说,知识目标包括:1.了解迷宫问题的背景和应用场景。

2.掌握迷宫问题的数学模型和基本概念。

3.熟悉常用的迷宫算法及其特点。

4.理解编程语言在解决迷宫问题中的应用。

技能目标包括:1.能够运用迷宫算法求解简单迷宫问题。

2.能够运用编程语言实现迷宫算法的求解。

3.能够对迷宫算法进行优化和改进。

情感态度价值观目标包括:1.培养学生对计算机科学和编程的兴趣。

2.培养学生解决问题的能力和创新思维。

3.培养学生的团队合作意识和沟通能力。

二、教学内容本课程的教学内容主要包括迷宫问题的基本概念、算法和编程技巧。

具体内容包括:1.迷宫问题的背景和应用场景。

2.迷宫问题的数学模型和基本概念。

3.常用的迷宫算法及其特点。

4.编程语言在解决迷宫问题中的应用。

教学大纲安排如下:第一课时:介绍迷宫问题的背景和应用场景,引入迷宫问题的数学模型和基本概念。

第二课时:介绍常用的迷宫算法及其特点,引导学生理解编程语言在解决迷宫问题中的应用。

第三课时:通过案例分析,让学生运用迷宫算法求解简单迷宫问题,培养学生的编程能力。

第四课时:引导学生对迷宫算法进行优化和改进,提高学生的解决问题的能力。

第五课时:进行课程总结和回顾,让学生展示自己的迷宫求解成果,进行交流和评价。

三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。

通过讲授法,向学生传授迷宫问题的基本概念、算法和编程技巧;通过讨论法,引导学生进行思考和交流,培养学生的创新思维;通过实验法,让学生动手实践,培养学生的编程能力和解决问题的能力。

在教学过程中,教师应根据学生的实际情况,灵活运用不同的教学方法,以激发学生的学习兴趣和主动性。

迷宫课程设计报告

迷宫课程设计报告

目录引言 (1)一.设计目的 (2)二.问题描述 (2)三.需求分析 (3)四.设计 (3)五.测试分析 (5)六.完整代码 (10)七.设计体会与小结 (17)八、成绩: (17)引言数据结构的学习过程,是进行复杂程序设计的训练过程,是算法构造性思维方法的训练过程,技能培养的过程不亚于知识传授。

数据结构课程教学的重要内容和主要难点在于让我们理解、习惯算法构造性思维方法。

培养我们的数据抽象能力、算法设计能力以及创造性思维方法,才能够举一反三、触类旁通,从而达到应用知识解决复杂问题的目的。

数据结构作为专业基础课程,可以对去年学习的c语言知识进行总结提高,为后续专业基础课程提供基础,它承上启下,贯通始终,是计算机科学与技术人才素质框架中的脊梁,对我们能力的培养至关重要。

通过对数据结构的学习,我们能够以问题求解方法、程序设计方法及一些典型的数据结构算法为对象,学会分析数据对象特征,掌握数理算法,初步掌握算法的时间、空间复杂分析基础,培养良好的程序设计风格以及进行复杂程序设计的技能。

一.设计目的这次课程设计,我们的题目是迷宫求解。

迷宫求解是数据结构中的经典问题,我期望达到的目的有以下4个。

1.巩固书本知识,对书上的知识能更透彻的了解.通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。

巩固我们所学的数据结构知识,消化课堂所讲解的内容。

也是对所学知识的整理,将原来在我们脑中比较混乱的课程设计重新梳理。

2.通过课程设计能更好的掌握迷宫求解中的设计思路,为以后灵活运用奠定基础。

3.能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告。

4.通过课程设计达到增强巩固数据结构知识的目的,使知识全面化、系统化。

二.问题描述迷宫问题来源于古希腊的神话,而后被人们演化为一个游戏。

以一个N*M的方正表示迷宫,0、1分别表示迷宫中的通路和障碍。

设计一个程序对任意设定的迷宫求出一条从入口的通道,或者的出没有通路的结论。

迷宫求解课程设计报告

迷宫求解课程设计报告

迷宫求解课程设计报告一、课程目标知识目标:1. 让学生掌握迷宫问题的基础知识,理解迷宫的构成元素及求解方法。

2. 培养学生运用数据结构表示迷宫,了解并运用深度优先搜索、广度优先搜索等算法解决迷宫问题。

技能目标:1. 培养学生运用计算机编程语言实现迷宫求解算法,提高编程能力。

2. 培养学生通过分析迷宫问题,设计合理的解决方案,并运用算法进行求解。

情感态度价值观目标:1. 培养学生对计算机科学产生兴趣,增强学习积极性。

2. 培养学生面对问题勇于挑战、积极思考的良好品质。

3. 培养学生团队合作意识,学会在团队中分工合作,共同解决问题。

课程性质分析:本课程为计算机科学相关课程,以迷宫问题为载体,教授数据结构、算法等知识。

课程注重理论与实践相结合,强调学生的动手实践能力。

学生特点分析:本课程面向的学生为初中年级学生,他们具备一定的计算机操作基础,对新鲜事物充满好奇,但可能对复杂算法的理解和运用存在一定难度。

教学要求:1. 教师应注重理论与实践相结合,通过实例讲解,使学生更容易理解和掌握知识。

2. 教学过程中,注重启发式教学,引导学生主动思考,培养学生的创新意识。

3. 针对不同学生的特点,因材施教,使学生在掌握基本知识的基础上,提高自身能力。

二、教学内容根据课程目标,教学内容分为以下三个部分:1. 迷宫基础知识- 迷宫的构成元素与类型- 迷宫问题的数学模型2. 迷宫求解算法- 数据结构:图、队列、栈- 深度优先搜索算法- 广度优先搜索算法- 最短路径算法:Dijkstra算法、A*算法3. 编程实践- 编程语言:Python、C++等- 迷宫求解算法的实现- 迷宫求解算法的优化教学大纲安排如下:第一周:- 迷宫基础知识学习- 数据结构图、队列、栈的介绍第二周:- 深度优先搜索算法与广度优先搜索算法讲解- 课堂练习:运用算法解决迷宫问题第三周:- 最短路径算法Dijkstra算法、A*算法讲解- 编程实践:实现迷宫求解算法第四周:- 编程实践:优化迷宫求解算法- 学生作品展示与评价教材章节关联:本教学内容与教材中“图与搜索算法”章节相关,涉及到的知识点包括图的基本概念、搜索算法及其应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二、课程设计容(含技术指标)【问题描述】以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

【任务要求】首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出。

其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。

编写递归形式的算法,求得迷宫中所有可能的通路。

以方阵形式输出迷宫及其通路。

【测试数据】迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。

出口出口四、基本要求1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。

若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。

2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。

3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。

设计报告以规定格式的电子文档书写、打印并装订,报告格式严格按照模板要求撰写,排版及图、表要清楚、工整。

从总体来说,所设计的程序应该全部符合要求,问题模型、求解算法以及存储结构清晰;具有友好、清晰的界面;设计要包括所需要的辅助程序,如必要的数据输入、输出、显示和错误检测功能;操作使用要简便;程序的整体结构及局部结构要合理;设计报告要符合规。

课程负责人签名:2011年7月1日迷宫与栈问题摘要数据结构是研究与数据之间的关系,是互相之间一种或多种特定关系的数据元素的集合,我们称这一关系为数据的逻辑结构。

数据结构在计算机的表示(又称映像)称为数据的物理结构,又称存储结构。

本次课程设计是迷宫求解问题,主要是模拟从入口到出口的通路。

程序中的数据采取的是“栈”作为数据的逻辑结构,并且使用链式存储结构,即是实现一个以链表作存储结构的栈类型。

本课程设计实现了链栈的建立,入栈,出栈,判断栈是否为空的方法,关键的是迷宫通路路径的“穷举求解”和递归求解的方法。

本课程设计重要说明了系统的设计思路、概要设计以及各个功能模块的详细设计和实现方法。

本次程序的开发工具是microsoft visual studio 2008,编程语言是C语言。

关键词:迷宫求解链栈穷举求解递归求解目录摘要……………………………………………………………IIII1需求分析 (1)1.1基本原理分析 (1)1.2功能要求 (1)2 概要设计 (2)2.1数据结构及其抽象数据类型的定义 (2)2.1.1栈的抽象数据类型 (2)2.1.2迷宫的抽象数据类型 (2)2.1.3功能模块分解 (3)3 详细设计 (4)3.1主函数与各功能模块 (4)3.2迷宫路径模块 (4)3.2.1算法分析 (4)3.2.2流程图 (5)4软件测试 (6)4.1调试过程中遇到的问题的解决,以及程序设计思想的实现 (6)4.2测试数据 (6)4.3测试结果 (8)4.4结果分析 (10)参考文献 (11)心得体会 (12)教师评语 (13)答辩记录表 (14)附录 (15)1 需求分析1.1基本原理分析迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。

定义迷宫类型来存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。

为处理方便起见,在迷宫的四周加一圈障碍。

对于迷宫任何一个位置,均约定东、南、西、北四个方向可通。

1.2功能要求(1)以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

迷宫的四周有一圈障碍。

(2)程序输出的结果以三元组(i,j,di)的形式输出,其中:(i,j)指示迷宫中的一个坐标,di表示走到下一坐标的方向,di的取值为1、2、3、4分别表示东、南、西、北(3)程序能够输出一个任意的迷宫从指定入口到出口的所有通路,以及以方阵形式输出迷宫(4)若设定的迷宫存在通路,则以方阵形式将迷宫及其通路输出到标准输出文件上,其中字符“1”表示障碍,“2”表示路径,“3”表示曾途经该位置但不能到达出口,其余位置用0表示。

若设定迷宫不存在通路则报告相应信息2 概要设计2.1数据结构及其抽象数据类型的定义2.1.1栈的抽象数据类型ADT LinkStack{数据对象:D={ai| ai∈CharSet,i=1,2…n,n>=0}数据关系:R1={<ai-1, ai >| ai-1, ai∈D,i=2,…n}基本操作:InitLinkStack(&S)操作结果:构造一个空栈S。

LinkStackEmpty(&S)初始条件:栈S已存在。

操作结果:若S为空栈,则返回TRUE,否则返回FALSE。

PushLinkStack (&S,e)初始条件:栈S已存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

PopLinkStack (&S,&e)初始条件:栈S已存在。

操作结果:删除S的栈顶元素,并以e返回其值。

} ADT LinkStack2.1.2迷宫的抽象数据类型ADT Maze{数据对象:D={ai,j| ai,j∈{0,1,2,3},0<=i<=m-1,0<=j<=n-1,m,n<=10} 数据关系:R={row,line}基本操作:InitMaze(&maze)初始条件:用迷宫类型Maze.arr[row][line]表示迷宫,迷宫的数据由用户自己定义,并且以值0表示通路,以值1表示障碍。

操作结果:构成迷宫的数字型数组,以0表示通路,以1表示障碍。

MazePath(&maze,start,end)初始条件:迷宫S已被赋值。

操作结果:若迷宫S中存在一条通路,则按如下规定改变迷宫S的状态:以2表示路径上的位置,以3表示死同;否则迷宫的状态不变。

MazePath_Recursion(&maze,cur,end,curstep)初始条件:迷宫S已被赋值。

操作结果:若迷宫S中存在通路,输出迷宫的可能路径。

PrintMaze(Maze)初始条件:迷宫M已经存在操作结果:以方阵形式输出迷宫。

}ADT Maze;2.1.3功能模块分解(1) 主程序模块:void main(){初始化;While(1){接受命令;处理命令;}}(2) 栈模块------实现栈的抽象数据类型typedef struct Stacknode{SElemType data;struct Stacknode *next;}*LinkStack;调用函数:InitLinkStack(),LinkStackEmpty(),PushLinkStack(),PopLinkStack() (3)迷宫模块----实现迷宫抽象数据类型typedef struct{int row;int line;}PosType;//迷宫中row行line列的位置typedef struct MazeType{int row;int line;int arr[MAXLEN][MAXLEN];}MazeType; //迷宫类型typedef struct{int ord; // 当前位置在路径上的“序号”PosType seat; //当前的坐标位置int di; //往下一坐标位置的方向}SElemType;调用函数:Pass(),FootPrint(),MarkPrint(),NextPos(),MazePath()或MazePath_Recursion(),PrintMaze().各个模块之间的调用关系如下:主程序模块->迷宫模块->栈模块3 详细设计3.1主函数与各功能模块主函数的各函数调用关系如图3-1所示,主函数调用创建迷宫函数和求解所有路径的函数,其中创建迷宫信息的函数调用初始化迷宫和输出迷宫。

图3-13.2 迷宫路径模块3.2.1算法分析解决迷宫问题最重要的程序段是找到通路,并存储在栈里,现只分析实现这一过程的函数do {若当前位置可通,则{ 将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东邻方块为新的当前位置;}否则,若栈不空且栈顶位置尚有其他方向未经探索,则设定的新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块;若栈不空但栈顶位置的四周均不可通,则{ 删去栈顶位置;若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空;}}while(栈不空);3.2.2 流程图图3-24软件测试4.1调试过程中遇到的问题的解决,以及程序设计思想的实现(1)调试过程中出现的错误有编译连接时的一些语法错误,也有由于算法存在问题而导致程序运行没有结果或者不是预期的结果。

这里主要说一下自己由于算法而导致的错误:因为没有注意结点不能重复走,所以造成了死循环,程序没有结果。

通过分析后把走过的结点变为不可走的结点,这样就避免了重复走到该结点。

还有就是判断迷宫是否有通路的这个结果不能如预期的结果那样:有通路就输出所有的通路,没有就输出“没有路径可走!”。

因为没有通路可走的时候栈是空的,但是输出所有的路径以后栈也是空的。

当迷宫有通路的时候,在输出所有路径以后还是会输出“没有路径可走!”这句话。

当迷宫没有通路的时候,输出“没有路径可走!”这句话。

因为算法的思想是这样的,所以达不到预期的结果。

解决的方法是如果迷宫有通路则输出所有的通路,如果迷宫没有通路,则没有结果输出。

(2)迷宫的求解一般采用的是“穷举求解”,利用栈的思想,先将入口位置进栈,判断方向,若其方向可通,则进栈,若不通,则出栈,如此循环下去。

4.2测试数据迷宫输入递归求路非递归求路径:以方阵形式输出迷宫及其通路:测试无通路的迷宫:4.3测试结果迷宫输入:求通路:以方阵形式输出迷宫及其通路:4.4结果分析本题中三个主要算法:InitMaze,MazePath和PrintMaze时间复杂度均为O (row*line),空间复杂度也为O(row*line)参考文献[1] 严蔚敏、吴伟民:《数据结构(C语言版)》[M],清华大学 2007年版[2] 谭浩强:《C语言设计(第三版)》[M],清华大学 2005年版[3] 曹衍龙、林瑞仲、徐慧:《C语言实例解析精粹(第二版)》[M],人民邮电心得体会通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C 语言的使用都有了更深的了解。

相关文档
最新文档