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

合集下载

数据结构课程设计迷宫问题求解

数据结构课程设计迷宫问题求解

数据结构课程设计迷宫问题求解正文:一、引言在数据结构课程设计中,迷宫问题求解是一个经典且常见的问题。

迷宫问题求解是指通过编程实现在迷宫中找到一条从起点到终点的路径。

本文将详细介绍如何用数据结构来解决迷宫问题。

二、问题分析1.迷宫定义:迷宫是由多个格子组成的矩形区域,其中包括起点和终点。

迷宫中的格子可以是墙壁(无法通过)或者通道(可以通过)。

2.求解目标:在给定的迷宫中,找到从起点到终点的一条路径。

3.输入:迷宫的大小、起点坐标、终点坐标以及墙壁的位置。

4.输出:从起点到终点的路径,或者提示无解。

三、算法设计1.基础概念a) 迷宫的表示:可以使用二维数组来表示迷宫,数组的元素可以是墙壁、通道或者路径上的点。

b) 坐标系统:可以使用(x, y)来表示迷宫中各个点的坐标。

c) 方向定义:可以用上、下、左、右等四个方向来表示移动的方向。

2.深度优先搜索算法(DFS)a) 算法思想:从起点开始,沿着一个方向一直走到无法继续为止,然后回退到上一个点,再选择其他方向继续探索。

b) 算法步骤:i) 标记当前点为已访问。

ii) 判断当前点是否为终点,如果是则返回路径;否则继续。

iii) 遍历四个方向:1.如果该方向的下一个点是通道且未访问,则继续向该方向前进。

2.如果该方向的下一个点是墙壁或已访问,则尝试下一个方向。

iv) 如果四个方向都无法前进,则回退到上一个点,继续向其他方向探索。

3.广度优先搜索算法(BFS)a) 算法思想:从起点开始,逐层向外探索,直到找到终点或者所有点都被访问。

b) 算法步骤:i) 标记起点为已访问,加入队列。

ii) 循环以下步骤直到队列为空:1.取出队首元素。

2.判断当前点是否为终点,如果是则返回路径;否则继续。

3.遍历四个方向:a.如果该方向的下一个点是通道且未访问,则标记为已访问,加入队列。

iii) 如果队列为空仍未找到终点,则提示无解。

四、算法实现1.选择合适的编程语言和开发环境。

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

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

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:迷宫算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:目录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环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

数据结构课程设计-迷宫问题(参考资料)

数据结构课程设计-迷宫问题(参考资料)

目录第一部分需求分析第二部分详细设计第三部分调试分析第四部分用户手册第五部分测试结果第六部分附录第七部分参考文献一、需求分析1、对于给定的一个迷宫,给出一个出口和入口,找一条从入口到出口的通路,并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。

2、可以用一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

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

3、编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

4、由于迷宫是任意给定的,所以程序要能够对给定的迷宫生成对应的矩阵表示,所以程序的输入包括了矩阵的行数、列数、迷宫内墙的个数、迷宫内墙的坐标、所求的通路的入口坐标、出口坐标。

二、详细设计1、计算机解迷宫通常用的是“穷举求解“方法,即从人口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

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

可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。

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

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

2、如果在某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试,如果这个位置已经没有方向可试了就再退一步,如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,那就说明这个迷宫根本不通。

3、所谓"走不通"不单是指遇到"墙挡路",还有"已经走过的路不能重复走第二次",它包括"曾经走过而没有走通的路"。

显然为了保证在任何位置上都能沿原路退回,需要用一个"后进先出"的结构即栈来保存从入口到当前位置的路径。

数据结构课程设计迷宫问题设计说明书

数据结构课程设计迷宫问题设计说明书

目录摘要 1前言 2正文 31. 采用类C语言定义相关的数据类型 32. 各模块的伪码算法 43. 函数的调用关系图 64. 调试分析 75. 测试结果 96. 源程序〔注〕⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯11参考文献 16总结17致谢18附件Ⅰ局部源程序代码 (19)摘要迷宫问题的求解是一个很好的在栈或者队列等方面的应用问题,本次设计是以栈去实现的。

问题的求解主要是给定一个入口坐标和出口坐标时求出一条从入口到出口的路径,如果不存在或存在要做出相应的判断,存在时打印其路径,并做动态演示。

关键字:栈,栈的存储结构,出栈与入栈前言由于计算机解迷宫时,通常用的是群举的方法,即从入口出发,顺某一方向搜索。

假设能走通,那么继续往前走;否那么沿原路退回,换一个方向再继续搜索,直至所有可能的通路都搜索完为止。

为了保证在任何位置上都能沿原路返回,这就需要一个后进先出的结构来存储起位置,所以用到了栈的概念。

在问题的求解过程中,用到了对栈的定义、栈的初始化、栈的空间的申情、栈的销毁等有关栈的知识。

通过这次课程设计可让我们更深一步的了解栈的概念。

在解决问题的过程中初步懂的如何去选择适宜的方法去处理问题,提高解决问题的效率。

正文1.采用类C语言定义相关的数据类型(1)定义坐标〔X,Y〕与搜索方向dir: typedefstruct{intx,y;intdir;}pos,elem;定义栈存放路径:typedefstruct{elem*b,*t;intsize;}stack;2、各模块的伪码算法(1)voidmazerandom(inti,intj,intr) //随即产生一个n*n的迷宫for(i=0;i<n;i++)mg[i][0]=mg[i][n-1]=mg[0][i]=mg[n-1][i]=1;// 设置围墙for(j=1;j<n-1;j++) //随即产生迷宫for(r=1;r<n-1;r++)mg[j][r]=rand()%2;(2)voidstep(stack*s,pos*cur,stack*reslut)//探索路径函数{Initstack(s);curpos=start; //设定“当前位置〞为“入口位置〞curstep=1;//探索第一步do{if(Pass(curpos)){FootPrint(curpos); //留下足迹e=(curstep,curpos,1);Push(S,e);//参加路径if(curpos==end) return(TRUE); //到达终点〔出口〕curpos=NextPos(curpos,1);curstep++;}//探索下一步else{//当前位置不能通过if(!StackEmpty(s)){pop(S,e);while(e.di==4&&!StackEmpty(S)){MarkPrint(e.seat); pop(S,e);//留下不能通过的标记,并退回一步}//whileif(e.di<4){e.di++; Push(S,e);//换下一个方向探索curpos=NextPos(e.seat,e.di);//设定当前位置是该新方向上的相领块}//if}//if}//else}while(!StackEmpty(S));return(FALSE);}//MazePath(3)voidsavepath(stack*s,pos*cur,stack*result)//保存路径函数{pos*top=s->t;if(stackempty(result))//假设栈result为空{push(result,cur);//可通路径坐标存入 result栈While(top>s->b)Push(result,--top);}elseif(sizeof(result)>sizeof(s))//假设result栈中元素多于s栈中元素clearstack(result);push(result,cur);//可通路径坐标存入result栈while(top>s->b)push(result,--top);}//Savepath(4)voidprint(stack*s,pos*s,stack*result)//输出{if(StackEmpty(result))printf(“Nowayavailable!〞);//输出没有找到elsewhile(!StackEmpty(result))//当栈非空{pop(result,cur);draw(y,x);//在屏幕上绘出路径printf(“(%d,%d)〞,x,y);}}//输出路径坐标3、函数关系调用图4、调试分析A、调试中遇到的问题既对问题的解决方案在输入迷宫的大小n时,假设n太大,例如n=30,屏幕无法显示第25行以及其后的方块。

数据结构课设--迷宫

数据结构课设--迷宫

数据结构课设--迷宫沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:迷宫算法院(系):计算机学院专业:计算机科学与技术班级:84010103学号:2022040101061姓名:李雪城指导教师:丁一军沈阳航空航天大学课程设计报告目录1课程设计介绍............................................................. ...............................................21.1课程设计内容............................................................. ..........................................21.2课程设计要求............................................................. ..........................................22课程设计原理............................................................. ...............................................22.1课设题目粗略分析............................................................. ..................................22.1.1迷宫的建立............................................................. .......................................22.1.2迷宫的存储............................................................. .......................................22.1.3迷宫路径的搜索............................................................. ...............................22.2原理图介绍...........................................................................................................32.2.1功能模块图............................................................. .......................................32.2.2流程图分析............................................................. ......................................33数据结构分析............................................................. ...............................................53.1概要设计............................................................. ...................................................53.1.1本程序设计思路............................................................. ..............................53.1.2本程序包含的函数............................................................. ..........................53.2详细设计............................................................. ..................................................53.2.1节点类型和指针类型............................................................. .......................53.2.2迷宫的操作............................................................. ......................................53.2.3输出结果............................................................. ...........................................74调试与分析............................................................. ...................................................84.1调试分析............................................................. ..................................................84.2测试结果............................................................. ................................................84.2.1当输入的行列数超过预设范围............................................................. .......84.2.2当输入的行列数未超过预设范围................................................................9参考文献............................................................. ...........................................................10附录(关键部分程序清单)........................................................... (11)1课程设计介绍1.1课程设计内容编写算法能够生成迷宫,并求解迷宫的路径(求解出任意一条到出口的路径即可)。

数据结构课程设计-迷宫问题

数据结构课程设计-迷宫问题

数据结构课程设计-迷宫问题正文:一、引言本文档旨在设计一个解决迷宫问题的数据结构课程项目。

迷宫问题是一个典型的寻路问题,要求从起点出发,在迷宫中找到一条路径到达终点。

迷宫由多个房间组成,这些房间之间通过门相连。

二、问题描述迷宫问题包含以下要素:1.迷宫的拓扑结构:迷宫由多个房间和门组成,每个房间有四面墙壁,每面墙壁可能有门或者是封闭的。

迷宫的起点和终点是预先确定的。

2.寻路算法:设计一个算法,在迷宫中找到一条从起点到终点的路径。

路径的选择标准可以是最短路径、最快路径或者其他约束条件。

3.可视化展示:实现一个可视化界面,在迷宫中展示起点、终点、路径,用于直观地演示解决方案。

三、设计思路1.数据结构设计:选择合适的数据结构来表示迷宫和路径,例如使用二维数组或者图来表示迷宫的拓扑结构,使用栈或队列来辅助寻路算法的实现。

2.寻路算法设计:可以使用深度优先搜索、广度优先搜索、Dijkstra算法、A算法等经典算法来实现寻路功能。

根据实际需求选择最合适的算法。

3.可视化展示设计:使用图形界面库(如Tkinter、Qt等)创建迷宫展示窗口,并实时更新迷宫的状态、路径的变化。

可以通过颜色、动画等方式增加交互性。

四、实现步骤1.创建迷宫:根据预设的迷宫大小,使用数据结构来创建对应的迷宫数据。

2.设定起点和终点:在迷宫中选择起点和终点的位置,将其标记出来。

3.寻路算法实现:根据选择的寻路算法,在迷宫中找到一条路径。

4.可视化展示:使用图形界面库创建窗口,并将迷宫、起点、终点、路径等信息展示出来。

5.更新迷宫状态:根据算法实现的过程,实时更新迷宫中的状态,并将路径显示在迷宫上。

附件:1.代码实现:包含迷宫创建、寻路算法实现和可视化展示的源代码文件。

2.演示视频:展示项目实际运行效果的视频文件。

法律名词及注释:1.数据结构:指在计算机科学中定义和组织数据的方式和方式的基础设施。

2.寻路算法:用于解决寻找路径的问题的算法。

(完整word版)数据结构课程设计(迷宫问题)

(完整word版)数据结构课程设计(迷宫问题)

课程设计报告课程名称数据结构课程设计课题名称迷宫问题专业班级学号姓名指导教师2012年6月9日课程设计任务书课程名称数据结构课程设计课题迷宫问题专业班级学生姓名学号指导老师审批任务书下达日期:2012年6月9日任务完成日期: 2012年6月16日一、设计内容与设计要求1.设计内容:1)问题描述以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。

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

2)基本要求a.实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一个坐标的方向。

b。

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

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

4)实现提示计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则,沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

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

可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(m,n)。

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

对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通.2.设计要求:●课程设计报告规范1)需求分析a.程序的功能.b.输入输出的要求。

2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。

3)详细设计a。

采用C语言定义相关的数据类型.b。

写出各模块的类C码算法.c.画出各函数的调用关系图、主要函数的流程图.4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。

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

数据结构课程设计报告设计题目:迷宫问题数据结构课程设计_班级:计科152学号:*********名:***南京农业大学计算机系数据结构课程设计报告内容一.课程设计题目迷宫问题以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

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

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

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

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

二.算法设计思想1.需求分析(1)迷宫数据用一个二维数组int maze[row][col]来存储,在定义了迷宫的行列数后,用两个for循环来录入迷宫数据,并在迷宫周围加墙壁。

(2)迷宫的入口位置和出口位置可以由用户自己决定。

2.概要设计(1)主程序模块:void main(){int maze[row][col];struct mark start,end; //出入口的坐标int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//方向,依次是东西南北built_maze(maze);printf("请输入入口的横纵坐标:");scanf("%d,%d",&start.a,&start.b);printf("请输入出口的横纵坐标:");scanf("%d,%d",&end.a,&end.b);printf("0为东,1为南,2为西,3为北,-1为出路\n");maze_path(maze,dir,start,end);getchar();}(2)栈模块——实现栈抽象数据类型(3)迷宫模块——实现迷宫抽象数据类型,建立迷宫,找出迷宫的一条通路3.详细设计(1)坐标位置类型struct mark{int a,b; //迷宫a行b列为位置};(2)迷宫类型void built_maze(int maze[row][col])//按照用户输入的row行和col列的二维数组(元素值为0和1)//设置迷宫maze的初值,包括边上边缘一圈的值void maze_path(int maze[row][col],int dir[4][2],struct mark start,struct mark end)//求解迷宫maze中,从入口start到出口end的一条路径,//若存在,则返回TRUE;否则返回FALSE(3)栈类型struct element{int i,j,d; //坐标与方向};typedef struct Linkstack{element elem;struct Linkstack *next;}*SLinkstack;4.求迷宫路径为伪码算法void maze_path(int maze[row][col],int dir[4][2],struct mark start,struct mark end){int i,j,d;int x,y;element elem,E;SLinkstack L1,L2;initstack(L1);initstack(L2);maze[start.a][start.b]=2;elem.i=start.a;elem.j=start.b;elem.d=-1; //d=-1表示无方向push_stack(L1,elem);while(!stack_empty(L1)){pop(L1,elem);i=elem.i;j=elem.j;d=elem.d+1; //下一个方向while(d<4) //探索东西南北各个方向{x=i+dir[d][0];y=j+dir[d][1];if(x==end.a&&y==end.b&&maze[x][y]==0) //这里表示已经到了出口{elem.i=i;elem.j=j;elem.d=d;push_stack(L1,elem);elem.i=x;elem.j=y;elem.d=-1;push_stack(L1,elem);while(L1) //逆置序列,输出迷宫路径{pop(L1,E);push_stack(L2,E);}while(L2){pop(L2,E);printf("%3d%3d%3d\n",E.i,E.j,E.d);}return;}if(maze[x][y]==0){maze[x][y]=2; //标记走过这个点elem.i=i;elem.j=j;elem.d=d;push_stack(L1,elem);i=x;j=y;d=-1;}d++;}}printf("此迷宫无出路");}5.主函数和其他函数的伪码算法void main(){int maze[row][col];struct mark start,end; //出入口的坐标int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};built_maze(maze); //方向,依次是东西南北printf("请输入入口的横纵坐标:");scanf("%d,%d",&start.a,&start.b);printf("请输入出口的横纵坐标:");scanf("%d,%d",&end.a,&end.b);printf("0为东,1为南,2为西,3为北,-1为出路\n");maze_path(maze,dir,start,end);getchar();}三.程序结构主程序built_maze maze_pathinitstack push_stack pop stack_empty四.实验结果与分析1.用户使用说明(1)本程序的运行环境为debug运行环境,执行文件为:19215225.cpp;(2)用VC++运行文件后出现以下窗口:点击运行程序(3)出现以下窗口后输入迷宫的行列数,回车;再继续输入迷宫的数据,1表示障碍,0表示通路;再输入入口坐标和出口坐标,回车。

就可以显示出迷宫路径。

2.测试结果(1)输入行列数:5,5输入迷宫数据为:0 0 0 1 11 1 0 1 10 0 0 1 00 1 1 0 00 0 0 0 0出口位置:1,1出口位置:5,5(2)输入行列数:4,9输入迷宫数据为:0 0 0 0 0 0 1 0 00 1 0 0 0 1 0 0 00 0 1 1 1 0 0 1 10 0 1 1 1 0 1 0 0输入入口坐标:1,1输入出口坐标:4,9(3)输入行列数:9,8输入迷宫数据为:0 0 1 0 0 0 1 00 0 1 0 0 0 1 00 0 0 0 1 1 0 10 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 10 1 1 1 1 0 0 11 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 输入入口坐标:1,1输入出口坐标:9,83.调试分析(1)在刚开始写完代码后,运行发现程序只能运行简单的一条直线的迷宫,在运行复杂的迷宫时,不会碰到死路(周围没有可探索的道路)就删除坐标往回到前坐标换方向探索。

最后我和同寝室同学一起探讨才发现程序中探索过的坐标没有标记,后来我将maze[x][y]=2将它作为标记才解决问题。

(2)程序中主要的两个算法:initmaze和maze_path的时间复杂度为O(m*n),空间复杂度也为O(m*n)。

五.总结(收获与体会)通过这段时间的课程设计,我对数据结构和C语言的理解更加深刻了。

在实践过程中我遇到了不少问题,但通过阅读相关书籍、求问老师同学,最终也解决了不少问题。

这些问题也给了我相当多的收获。

但通过这段时间的学习和解决的这么多问题,我觉得我对这些知识的掌握比以前好了许多。

求解迷宫问题用的是“穷举求解”的方法。

从入口出发,沿着某一方向探索(这里我选择优先探索的是东面),若无障碍,继续往前走,否则眼原路返回,换个方向继续探索,直到将所有可能的通道都探索完为止。

所以需要用栈来保存从入口到当前位置的路径。

但因为之前在学习栈这一节的时候没学扎实,现在有很多知识都忘了。

所以在编写求解迷宫路径的算法的时候我觉得有些困难,后来经过一步步分析和借鉴书上的穷举法才把算法写出来。

但我还是除了许多错误,其中大部分是语法错误,这些最后都还是一一解决了。

而且除了加深了栈的学习,我还复习了以前大一学的C语言中的二维数组和for,while循环。

这次课程设计不仅是让我们加深了解数据结构的理论知识,更重要的是培养我们解决实际问题的能力,能在不断地遇到问题,不断地解决问题的过程中培养自己的专业思维。

所以我相信通过这次课程设计我们能够提升自己的分析、设计程序和编写程序的能力。

六.源程序#include<stdio.h>#include<stdlib.h>#define row 100#define col 100struct mark{int a,b;};struct element{int i,j,d; //坐标与方向};typedef struct Linkstack{element elem;struct Linkstack *next;}*SLinkstack;int initstack(SLinkstack &L){L=NULL;return 1;}int stack_empty(SLinkstack L){if(L==NULL)return 1;elsereturn 0;}int push_stack(SLinkstack &L,element E){SLinkstack P;P=(SLinkstack)malloc(sizeof(Linkstack));P->elem=E;P->next=L;L=P;return 1;}int pop(SLinkstack &L,element &E){SLinkstack P;if(!stack_empty(L)){E=L->elem;P=L;L=L->next;free(P);return 1;}elsereturn 0;}void built_maze(int maze[row][col])//建立迷宫{int x,y;int m,n;printf("请输入迷宫的行列数(用逗号隔开):");scanf("%d,%d",&m,&n);printf("请输入迷宫各行各列的数据(用空格隔开):\n");for(x=0;x<m+2;x++){for(y=0;y<n+2;y++){if(x==0||x==m+1||y==0||y==n+1)//迷宫周围加墙壁maze[x][y]=1;elsescanf("%d",&maze[x][y]);}}printf("迷宫生成中……\n");printf("迷宫显示为:\n");for(x=0;x<m+2;x++){for(y=0;y<n+2;y++)printf("%3d",maze[x][y]);printf("\n");}}void maze_path(int maze[row][col],int dir[4][2],struct mark start,struct mark end){int i,j,d;int x,y;element elem,E;SLinkstack L1,L2;initstack(L1);initstack(L2);maze[start.a][start.b]=2; //标记起点坐标elem.i=start.a;elem.j=start.b;elem.d=-1; //d=-1表示无方向push_stack(L1,elem);while(!stack_empty(L1)){pop(L1,elem);i=elem.i;j=elem.j;d=elem.d+1; //下一个方向while(d<4) //探索东西南北各个方向{x=i+dir[d][0];y=j+dir[d][1];if(x==end.a&&y==end.b&&maze[x][y]==0){//这里表示已经到了出口elem.i=i;elem.j=j;elem.d=d;push_stack(L1,elem);elem.i=x;elem.j=y;elem.d=-1;push_stack(L1,elem);while(L1) //逆置序列,输出迷宫路径{pop(L1,E);push_stack(L2,E);}while(L2){pop(L2,E);printf("(%d,%d,%d)\n",E.i,E.j,E.d);}return;}if(maze[x][y]==0){maze[x][y]=2; //标记走过这个点elem.i=i;elem.j=j;elem.d=d;push_stack(L1,elem);i=x;j=y;d=-1;}d++;}}printf("此迷宫无出路");}void main(){int maze[row][col];struct mark start,end; //出入口的坐标int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //方向,依次是东西南北printf("************************************************** *********************************************\n");printf("\t*************** 欢迎使用迷宫模拟程序***************\n");printf("************************************************** *********************************************\n");built_maze(maze);printf("请输入入口的横纵坐标:");scanf("%d,%d",&start.a,&start.b);printf("请输入出口的横纵坐标:");scanf("%d,%d",&end.a,&end.b);printf("0为东,1为南,2为西,3为北,-1为出路\n");maze_path(maze,dir,start,end);printf("按任意键继续");getchar();}。

相关文档
最新文档