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

合集下载

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

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

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

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

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

二、问题分析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.选择合适的编程语言和开发环境。

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

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

课程设计(论文)题目名称迷宫求解课程名称数据结构课程设计学生姓名学号系、专业信息工程系、电气信息类(信息类)指导教师申寿云2010年1 月3 日摘要设计一个简单迷宫程序,从入口出发找到一条通路到达出口。

编制程序给出一条通过迷宫的路径或报告一个“无法通过”的信息。

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

用“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

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

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

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

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

关键词:迷宫;栈;链表;二维数组目录1 问题描述 (1)2 需求分析 (1)3 概要设计 (1)3.1抽象数据类型定义 (1)3.2模块划分 (2)4 详细设计 (2)4.1数据类型的定义 (2)4.2主要模块的算法描述 (3)5 测试分析 (6)6 课程设计总结 (7)参考文献 (7)附录(源程序清单) (9)1 问题描述迷宫是一个M行N列的0-1矩阵,其中0表示无障碍,1表示有障碍。

设入口为(1,1)出口为(M,N)每次移动只能从一个无障碍的单元移到其周围8个方向上任一无障碍的单元,编制程序给出一条通过迷宫的路径或报告一个“无法通过”的信息。

2 需求分析(1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

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

否则报告一个无法通过的信息。

(2)建立InitStack函数,用于构造一个空栈。

(3)建立DestroyStack函数,用于销毁栈。

(4)建立Pop函数,用于删除栈顶元素,返回栈顶元素的值。

数据结构程序设计(迷宫问题)

数据结构程序设计(迷宫问题)

数据结构程序设计(迷宫问题)数据结构程序设计(迷宫问题)一、引言迷宫问题是计算机科学中常见的问题之一,它涉及到了数据结构的设计和算法的实现。

本文将介绍迷宫问题的定义、常见的解决算法和程序设计思路。

二、问题定义迷宫问题可以描述为:给定一个迷宫,迷宫由若干个连通的格子组成,其中有些格子是墙壁,有些格子是路径。

任务是找到一条从迷宫的起点(通常是左上角)到终点(通常是右下角)的路径。

三、基本数据结构1.迷宫表示:迷宫可以使用二维数组来表示,数组中的每个元素代表一个格子,可以用0表示路径,用1表示墙壁。

2.坐标表示:可以使用二维坐标表示迷宫中的每一个格子,使用(x, y)的形式表示。

四、算法设计1.深度优先搜索算法:深度优先搜索算法可以用来解决迷宫问题。

算法从起点开始,尝试向四个方向中的一个方向前进,如果可以移动则继续向前,直到到达终点或无法继续移动。

如果无法继续移动,则回溯到上一个节点,选择另一个方向继续搜索,直到找到一条路径或者所有路径都已经探索完毕。

2.广度优先搜索算法:广度优先搜索算法也可以用来解决迷宫问题。

算法从起点开始,先将起点加入队列,然后不断从队列中取出节点,并尝试向四个方向中的一个方向移动,将新的节点加入队列。

直到找到终点或者队列为空,如果队列为空则表示无法找到路径。

五、程序设计思路1.深度优先搜索算法实现思路:a) 使用递归函数来实现深度优先搜索算法,参数为当前节点的坐标和迷宫数据结构。

b) 判断当前节点是否为终点,如果是则返回成功。

c) 判断当前节点是否为墙壁或已访问过的节点,如果是则返回失败。

d) 将当前节点标记为已访问。

e) 递归调用四个方向,如果存在一条路径则返回成功。

f) 如果四个方向都无法找到路径,则将当前节点重新标记为未访问,并返回失败。

2.广度优先搜索算法实现思路:a) 使用队列保存待访问的节点。

b) 将起点加入队列,并标记为已访问。

c) 不断从队列中取出节点,尝试向四个方向移动,如果新的节点未被访问过且不是墙壁,则将新的节点加入队列,并标记为已访问。

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

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

《数据结构》课程设计一、数据结构课程设计要求学生必须仔细阅读《数据结构》课程设计方案,认真主动完成课设的要求。

有问题及时主动通过各种方式与教师联系沟通。

学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。

课程设计按照教学要求需要一周时间完成,一周中每天(按每周5天)至少要上3-4小时的机来调试C语言设计的程序,总共至少要上机调试程序30小时。

课程设计在17周之前交。

最好一起上交。

同班同学之间最好不要相同。

每4人一组。

每组交一份文档。

输入规定:输入数据有相应的提示。

输出形式:有提示,要求界面美观。

界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

不能用图形界面,只用字符界面即可(注意,课程设计不是完全的软件设计,可不追求界面的完美)。

存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。

(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;测试数据:要求使用(1)、全部合法数据;(2)、整体非法数据;(3)、局部非法数据。

进行程序测试,以保证程序的稳定。

测试数据及测试结果请在上交的资料中写明;二、数据结构课程设计的具体内容本次课程设计完成如下模块。

1、好友信息管理任务:编写一好友信息管理软件。

信息包括好友的基本资料,联系方式,爱好等。

功能要求:1).好友信息输入后,必须将资料能进行文件保存;软件启动后,亦能读取文件中的数据。

2).能对好友进行增,删,查,改等基本操作。

3).可以根据具体情况进行其他操作,如统计,提示好友生日等;4).对好友数据可按姓名等关键信息进行排序输出。

如打印花名册,统计报告等。

2、一元多项式计算任务:1).能够按照指数降序排列建立并输出多项式;2).能够完成两个多项式的相加,并将结果输出;3).能根据输入的多项式及变量的值,能进行计算。

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

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

课题设计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环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

数据结构迷宫求解

数据结构迷宫求解

数据结构迷宫求解迷宫问题是一种常见的求解问题,通过在迷宫中找到从起点到终点的路径。

在计算机科学中,使用数据结构来解决迷宫问题非常方便。

本文将介绍迷宫问题的基本原理、常见的求解方法以及使用不同数据结构的优缺点。

首先,我们需要明确迷宫的基本定义。

迷宫可以看作是一个二维的网格,其中包含一些墙壁和通路。

起点是迷宫的入口,终点则是迷宫的出口。

我们的目标是找到从起点到终点的一条路径。

迷宫问题可以使用多种算法求解,包括深度优先(DFS)、广度优先(BFS)、最短路径算法等。

以下将详细介绍这些算法以及它们在迷宫问题中的应用。

同时,我们还会讨论不同数据结构在求解迷宫问题中的优缺点。

首先,深度优先(DFS)是一种常用的求解迷宫问题的算法。

该算法从起点开始,一直到终点,期间遇到墙壁或已经访问过的点则回溯到上一个节点。

DFS可以使用递归实现,也可以使用栈来保存需要回溯的节点。

DFS的优点是简单易懂,易于实现。

然而,它可能会陷入死循环或者找到一条较长的路径而不是最短路径。

另一种常见的算法是广度优先(BFS),它从起点开始,逐层扩展,直到找到终点为止。

BFS可以使用队列来保存每一层的节点。

与DFS相比,BFS能够找到最短路径,但它需要维护一个较大的队列,从而增加了空间复杂度。

除了DFS和BFS,还有一些其他算法可以应用于迷宫问题。

例如,迪杰斯特拉算法和A*算法可以找到最短路径。

这些算法使用了图的概念,将迷宫中的通道表示为图的边,将各个节点之间的距离表示为图的权重。

然后,通过计算最短路径的权重,找到从起点到终点的最短路径。

迪杰斯特拉算法和A*算法的优点是能够找到最短路径,但它们的实现较为复杂。

在使用这些算法求解迷宫问题时,我们需要选择适合的数据结构来存储迷宫和过程中的状态。

以下是几种常见的数据结构以及它们的优缺点:1.数组:数组是一种常见的数据结构,它可以用来表示迷宫。

可以使用二维数组来表示迷宫的网格,并使用特定的值表示墙壁和通路。

数据结构课程设计之迷宫

数据结构课程设计之迷宫

数据结构课程设计之迷宫迷宫是一种具有迷惑性和挑战性的游戏。

在数据结构课程设计中,迷宫也常常被用作一个有趣而且实用的案例。

在这篇文章中,我将探讨迷宫的设计和实现,以及如何利用数据结构来解决迷宫问题。

首先,让我们来思考一下迷宫的基本要素。

一个典型的迷宫由迷宫的墙壁、通道和出口组成。

墙壁是迷宫的边界,通道是迷宫的路径,而出口则是通往自由的大门。

在数据结构中,我们可以使用二维数组来表示迷宫的结构。

迷宫的墙壁可以用1表示,通道可以用0表示,而出口可以用特殊的标记来表示。

接下来,我们需要考虑如何生成一个随机的迷宫。

一种常见的方法是使用深度优先搜索算法。

该算法从一个起始点开始,不断地随机选择一个相邻的未访问过的格子,然后将当前格子和选择的格子之间的墙壁打通。

这个过程一直进行,直到所有的格子都被访问过为止。

这样,我们就可以生成一个随机的迷宫结构。

在迷宫的设计中,一个关键的问题是如何找到从起点到终点的路径。

这可以通过使用图的搜索算法来解决。

其中,广度优先搜索算法是一种常用的方法。

该算法从起点开始,逐层地向外搜索,直到找到终点为止。

在搜索过程中,我们需要使用一个队列来保存待访问的格子,以及一个数组来记录每个格子的访问状态。

当找到终点时,我们可以通过回溯的方式,从终点一直追溯到起点,得到一条路径。

除了寻找路径,我们还可以通过其他方式来解决迷宫问题。

例如,我们可以计算迷宫中每个格子到终点的最短距离。

这可以通过使用动态规划的方法来实现。

我们可以先将所有格子的距离初始化为一个很大的值,然后从终点开始,逐步更新每个格子的距离,直到到达起点为止。

这样,我们就可以得到每个格子到终点的最短距离。

此外,我们还可以利用数据结构来解决其他与迷宫相关的问题。

例如,我们可以使用并查集来判断迷宫中的两个格子是否连通。

我们可以使用堆来找到迷宫中的最短路径。

我们还可以使用哈希表来记录迷宫中每个格子的属性,如是否有陷阱或宝藏等。

在数据结构课程设计中,迷宫是一个非常有趣和实用的案例。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

课程设计(论文)题目名称考试成绩统计课程名称数据结构课程设计学生姓名王彪学号0841330152系、专业信息工程系、电气信息类(信息类)指导教师申寿云2010年1 月3 日目录1 问题描述 (2)2 设计思路 (2)3 模块划分 (3)4 主要模块的描述 (4)5 程序测试与分析 (10)6 程序设计的心得体会 (11)7 参考文献 (12)8 附录(源程序) (14)1 问题描述设计一个简单迷宫程序(用栈实现),从入口出发,按某一方向(自定义入口)向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若所有方向均没有通路,则沿原点返回前一点,换下一个方向在继续试探,直到所有可能的通路都探索到,或找到一条通路(自定义出口),或无路可走又返回到入口点。

2 设计思路分析题目可以得知,在自定义中的迷宫中的数据的保存顺序和数据导出顺序相反,由此可利用栈的先进后出特性来实现。

为了保证在达到某一点后不能继续向前行走(无路)时,能沿原路正确返回前一点以便继续从下一个方向试探,则也需要用到一个栈保存所能够到达的每一点击从该点前进的方向。

首先由用户定义迷宫的行列数和迷宫并告知入口与出口,程序将自动输出路径。

(太简单了)3 模块划分(1)主程序模块void main(){堆栈的定义;堆栈的初始化;入栈、出栈;迷宫求解;输出结果;}(2)栈模块——实现栈的抽象数据类型(3)迷宫模块——实现迷宫的抽象数据类型4 主要模块的算法描述4.1 主要模块的定义void footprint(int a[N][N],struct sit *seat){int i,j;i=seat->seatx;j=seat->seaty;a[i][j]=-1;}迷宫求解时事物的坐标定义void nextpos(struct sit *find,struct sit *seat,int di){int i,j;switch(di){case 1:i=seat->seatx;j=seat->seaty+1;break;case 2:i=seat->seatx+1;j=seat->seaty;break;case 3:i=seat->seatx;j=seat->seaty-1;break;case 4:i=seat->seatx-1;j=seat->seaty;break;}find->seatx=i;find->seaty=j;}迷宫求解时路径选择的实现int pass(struct sit *curpos,int a[N][N]){int i,j;i=curpos->seatx;j=curpos->seaty;if(a[i][j]==0)return 1;else return 0;}判断路径是否行得通print(struct stack *s){ do{printf("(%d,%d)",s->base->seat->seatx,s->base->seat->seaty);s->base++;}while(s->top!=s->base);}实现迷宫求解时对事物的操控void initstack(struct stack *s){struct finds *link,*end;s->base=s->top=link=(struct finds *)malloc(SIS*sizeof(struct finds)); end=link+SIS-1;for(;link<=end;link++)link->seat=(struct sit *)malloc(sizeof(struct sit));s->size=SIS;}//堆栈初始化(不能这样就是代码,论文中尽量少用代码)4.2 各模块流程描述图4.1 XXXXXXXXX图图4.2 初始化图4.4迷宫下一个位置的探求图4.5 输出5 结果分析图1-1 迷宫程序运行的一个截屏图5.1 XXXXXXXXX图(不能就只有一个图,还要文字说明测试情况)6 课程设计总结与体会两个多星期的课程设计,虽然有些疲劳和困倦,但带给我很多的收获。

通过这编程, 我对数据结构有了更深刻的了解, 初步了解学生成绩统计编写过程中需要注意的事项,应用了一些简单函数和语句的同时, 提高了实际操作的技巧。

本课程设计虽然比较简单,但使我充分理解并掌握了各种排序的算法,进一步掌握并熟练的对子函数进行调用,特别是冒泡排序的应用。

同时通过本次课程设计也极大的提高了我读程序的能力。

在这个设计过程中,我也遇到过很多困难,如在函数的调用过程中,在数据的排序过程中,但是通过对问题的分析,发现,然后对问题的逐一解决过程中,我在此也学到了不少知识,发现了自己的不足。

同时非常感谢同学和朋友们对我的热心帮助以及我的指导老师申寿云老师对我的细心指导,使我的问题越来越少,设计日趋完善。

7 参考文献[1] 黄同成,黄俊民,董建寅.数据结构[M].北京:中国电力出版社,2008[2] 董建寅,黄俊民,黄同成.数据结构实验指导与题解[M].北京:中国电力出版社,2008[3] 严蔚敏,吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,2002[4] 刘振鹏,张晓莉,郝杰.数据结构[M].北京:中国铁道出版社,20038 附录、源程序清单#include < stdlib.h>#include < stdio.h >#define SIS 100#define N 10struct sit{int seatx;int seaty;};//当前访问的坐标struct finds{int ord;struct sit *seat;int di;};//di为下个寻找的方向struct stack{struct finds *base;struct finds *top;int size;};void initstack(struct stack *s){struct finds *link,*end;s->base=s->top=link=(struct finds *)malloc(SIS*sizeof(struct finds)); end=link+SIS-1;for(;link<=end;link++)link->seat=(struct sit *)malloc(sizeof(struct sit));s->size=SIS;}//堆栈初始化void push(struct stack *s,struct finds *find){struct finds *link,*end;if(s->top-s->base>=s->size){s->base=(struct finds *)realloc(s->base,(s->size+SIS)*sizeof(struct finds)); link=s->base+s->size;s->top=s->size+s->base;s->size+=SIS;end=s->base+s->size;for(;link<=end;link++)link->seat=(struct sit *)malloc(sizeof(struct sit));}s->top->ord=find->ord;s->top->seat->seatx=find->seat->seatx;s->top->seat->seaty=find->seat->seaty;s->top->di=find->di;s->top++;}void pop(struct stack *s,struct finds *find){s->top--;find->ord=s->top->ord;find->seat->seatx=s->top->seat->seatx;find->seat->seaty=s->top->seat->seaty;find->di=s->top->di;}void footprint(int a[N][N],struct sit *seat){int i,j;i=seat->seatx;j=seat->seaty;a[i][j]=-1;}void nextpos(struct sit *find,struct sit *seat,int di){int i,j;switch(di){case 1:i=seat->seatx;j=seat->seaty+1;break;case 2:i=seat->seatx+1;j=seat->seaty;break;case 3:i=seat->seatx;j=seat->seaty-1;break;case 4:i=seat->seatx-1;j=seat->seaty;break;}find->seatx=i;find->seaty=j;}int pass(struct sit *curpos,int a[N][N]){int i,j;i=curpos->seatx;j=curpos->seaty;if(a[i][j]==0)return 1;else return 0;}print(struct stack *s){ do{printf("(%d,%d)",s->base->seat->seatx,s->base->seat->seaty); s->base++;}while(s->top!=s->base);}void main(){struct stack *s;struct finds *find,*e;struct sit *start,*end,*curpos;int curstep=1,a[N][N],i,j,n,m,pa;//char c[N][N];s=(struct stack *)malloc(sizeof(struct stack));find=(struct finds *)malloc(sizeof(struct finds));e=(struct finds *)malloc(sizeof(struct finds));start=(struct sit *)malloc(sizeof(struct sit));end=(struct sit *)malloc(sizeof(struct sit));curpos=(struct sit *)malloc(sizeof(struct sit));initstack(s);puts("在使用前请仔细阅读使用说明");while(1){printf("请输入迷宫的长和宽(n,m)");pa=scanf("%d,%d",&n,&m);if(pa!=2||n>81||m>81||n<=0||m<=0)puts("输入数据错误,请重新输入");else break;}printf("请输入你的迷宫(0代表路径,连续输入)\n");for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&a[i][j]);while(1){printf("进入迷宫的位置(n,m)");scanf("%d,%d",&curpos->seatx,&curpos->seaty);if(curpos->seatx>81||curpos->seaty>81||curpos->seatx<=0||curpos->seaty<=0||curpos->seat x>=n||curpos->seatx>=m||curpos->seaty>=m||curpos->seaty>=n)puts("输入数据错误,请重新输入");else break;}while(1){printf("走出迷宫的位置(n,m)");scanf("%d,%d",&end->seatx,&end->seaty);if(end->seatx>81||end->seaty>81||end->seatx<=0||end->seaty<=0||end->seatx>=n||end->sea tx>=m||end->seaty>=n||end->seaty>=m)puts("输入数据错误,请重新输入");else break;}do{if(pass(curpos,a)){footprint(a,curpos);e->ord=curstep;e->seat=curpos;e->di=1;push(s,e);if(curpos->seatx==end->seatx&&curpos->seaty==end->seaty)break;nextpos(curpos,e->seat,1);curstep++;}else {if(e->di<4){pop(s,e);e->di++,push(s,e);nextpos(curpos,e->seat,e->di);} else if(e->di==4){pop(s,e);pop(s,e);push(s,e);e->di++;if(e->di>4)pop(s,e);nextpos(curpos,e->seat,e->di);}}}while(1);puts("输出路径为");print(s);puts("\n");}。

相关文档
最新文档