master
Tingyu Meng 2 years ago
parent 1b868827e7
commit 1185547679

@ -57,53 +57,121 @@
# 2. 系统设计
## 2.1 概要设计
系统划分为几个模块,可以画模块图。
逐个说明每个模块的功能(输入、输出、做什么,这里不写怎么做)。
系统主要划分为6个模块.首先用宽搜来寻找最短路径的长度,然后用深搜来找出所有路径,并且标记出其中的最短的路径。其中宽搜采用的是队列,深搜采用的是栈。思路都是去寻找可以走的几个方向,逐个判断就行了。
## 2.2 数据结构设计
首先,分析对比几种可选的数据结构设计方案。如图可以采用邻接矩阵,也可以采用邻接表,表示集合可以用普通的查找表,还可以用不相交集。给出每一种设计方案的特点(优势、不足等)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。
### 1xxx结构
给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。多个数据结构,逐一列出。
### 2xxx结构
给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。
###
设计步骤:
(1)构建一个二维数组 maze [ M +2][ N +2]用于存储迷宫矩阵
(2)自动或手动生成迷宫,即为二维数组
(4)构建一个队列用于存储迷宫路径
(4)建立迷宫节点 struct point ,用于存储迷宫中每个节点的访问情况
maze [ M +2][ N +2]赋值
(5)实现搜索算法
(6)屏幕上显示操作菜单
该项目的主要10个函数
(1)主函数 main ()
(2)手动生成迷宫函数 shoudong _ maze ()
(3)自动生成迷宫函数 zidong _ maze ()
(4)将迷宫打印成图形 print _ maze ()
(5)打印迷宫路径(若存在路径) result _ maze ()
(6)入队 enqueue ()
(7)出队 dequeue ()
(8)判断队列是否为空 is _ empty ()
(9)访问节点 visit ()
(10搜索迷宫路径 mgpath ()
### 1结构
1节点类型和指针类型
迷宫矩阵类型
迷宫中节点类型及队列类型
2.迷宫的操作
(1)手动生成迷宫
(2)自动生成迷宫
(3)打印迷宫图形
3菜单选择
## 2.3 算法设计
首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。
### 1XXX算法
给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。
### 2XXX算法
给出核心算法的设计,包括伪代码或流程图。
我们实现了一种可实现数据结构并且运用的数据结构都能完整的实现生成所需迷宫。考虑到我们现有的开发工具只有git与vscode,目前同学所学知识主要是队列,栈和图等基本的数据结构基础,因此还是选用一种数据结构方法实现迷宫生成。
### 1算法
1节点类型和指针类型
迷宫矩阵类型: int maze [ M +2][ N +2];为方便操作使其为全局变量
迷宫中节点类型及队列类型: struct pointlint row , col , predecessor } que [512]
2.迷宫的操作
(1手动生成迷宫
void shoudong _ maze ( int m , int n )
(定义 i , j 为循环变量
for ( i <= m )
for ( j <= n )
输入 maze [ i ][ j ]的值
(2自动生成迷宫
void zidong _ maze ( int m , int n )
(定义 i , j 为循环变量
for ( i <= m )
for ( j <= n )
maze [ i ][ j ]= rand ()%2
//由于 rand (产生的随机数是从0到 RAND _ MAX , RAND _ MAX 是定义在 stdlib . h 中的其值至少为32767),要产生从 X 到 Y 的数,只需要这样写: k = rand ()%( Y - X +1)+ X ;
(3打印迷宫图形
void print _ maze ( int m , int n )
(用 i , j 循环变量,将 maze [ i ][ j ]输出口、)(4)打印迷宫路径
void result _ maze ( int m , int n )
(用 i , j 循环变量,将 maze [ i ][ j ]输出口、、☆](5搜索迷宫路径
①迷宫中队列入队操作
void enqueue ( struct point p )
[将 p 放入队尾, tail ++
②迷宫中队列出队操作
struct point dequeue ( struct point p )
{ head ++,返回 que [ head -1]]
③判断队列是否为空
int is _ empty ()
{返回 head == tail 的值当队列为空时返回0④访问迷宫矩阵中节点
void visit ( int row , int col , int maze [41][41])
{建立新的队列节点 visit _ point ,将其值分别赋为 row , col , head -1, maze [ row ][ col ]=2表示该节点以被访问过调用
enqueue ( visit _ point ),将该节点入队)
⑤路径求解
void mgpath ( int maze [41][41], int m , int n )
(先定义入口节点为 struct point p =(0,0,-1),从 maze [0][0开始访问。如果入口处即为障碍则此迷宫无解返回0程序结束。否则访问入口节点将入口节点标记为访问过 maze [ p . row ][ p . col ]=2,调用函数 enqueue ( p )将该节点入队。
判断队列是否为空,当队列不为空时,则运行以下操作:
(调用 dequeue ()函数,将队头元素返回给 p ,
如果 p . row == m -1且 p . col == n -1即到达出口节点即找到了路径结束
如果 p . col +1< n maze [ p . row ][ p .co1+1]==0 visit ( p . row , p . col +1, maze )访
如果 p . row +1< m maze [ p . row +1][ p . col ]==0 visit ( p . row +1, p . col , maze )访
如果 p . col -1>0且 maze [ p . row ][ p .co1-1]==0说明未到迷宫左边界且其左方有通路则 visit ( p . row , p . col -1, maze ),将左方节点入队标记已访问
如果 p . row -1>0且 maze [ p . row -1][ p . col ]==0说明未到迷宫上边界且其上方有通路则 visit ( p . row , p . col +1, maze ),将上方节点入队标记已访问
访问到出口(找到路径)即 p . row == m -1且 p . col == n -1则逆序将路径标记为3即 maze [ p . row ][ p . col ]==3;
while ( p . predecessor !=-1)
[ p = queue [ p . predecessor ]; maze [ p . row ][ p . col ]==3;)
最后将路径图形打印出来。
3菜单选择
while ( cycle !=(-1))
☆手动生成迷宫
请按1
请按2
请按3
☆退出
scanf ("% d ",& i );
switch ( i )
☆自动生成迷宫
☆退出
scanf ("% d ",& i );
switch ( i )
( case 1请输入行列数如果超出预设范围则提示重新输入
请按2
请按3
shoudong _ maze ( m , n );
print _ maze ( m , n );
mgpath ( maze , m , n );
if ( X !=0) result _ maze ( m , n );
case 2请输入行列数如果超出预设范围则提示重新输入
zidong _ maze ( m , n );
print _ maze ( m , n );
mgpath ( maze , m , n );
if ( X !=0) result _ maze ( m , n );
case 3:cycle=(-1); break ;
# 3. 系统实现
说明所使用的语言、开发工具等。
介绍项目的文件结构,以及主要函数的功能。
## 3.1 核心数据结构的实现
描述数据结构的实现方法。
可以配合程序代码加以说明。如:
int maze[M][N],row,col;
typedef struct 栈操作函数
void Init_hand_Maze(int maze[M][N],int m,int n)
@ -128,7 +196,6 @@ Init_hand_Maze(maze,m,n);
时间复杂度 Om*n
void Init_automatic_Maze(int maze[M][N],int m,int n) 求解迷宫
Status MazePath(Stack &S,MazeType &e,int maze[M][N], int m, int n)
{
@ -181,15 +248,8 @@ cout<<endl;
cout<<" 完成!"<<endl;
return OK;
}
## 3.2 核心算法的实现
描述算法的实现方法。
可以配合程序代码加以说明。如:
主函数
int main()
{
@ -217,12 +277,6 @@ break;
}
}
}
对该算法的时间和空间复杂度进行分析。
# 4. 系统测试
描述测试的思路和方法。比如,先用小数据量进行测试,再用真实数据进行测试。
@ -252,9 +306,8 @@ break;
周羽凡:在这次的迷宫项目中,我们小组通过分工合作完成了这次设计,对于此次困难的问题,我们所有人并没有选择退缩,这也让我感受到了信心。于是在一次次的错误以及失败中我们不断改进,然后取得了丰厚的成果,这也让我了解到只要我们坚持不懈没有什么难题是解决不了的。我也认识到合作的重要性,将一个难题分为几个部分,小组成员都一起努力,逐个击破难题,不仅出色的完成了任务,也大大缩短了完成项目所需要的时间。
成员4
孟婷玉:迷宫课程项目设计非常之难,这让我们一开始无从下手。后来我们明确,完成迷宫这个课程设计这个项目,需要先整体构建起框架,在思考输入和输出分别具体是什么,然后思考需要运用那些知识,已会的知识需要去灵活的搬运和应用,如数组和栈和图;不会的知识点需要通过自己去学习,去网上搜索资料,去查阅老师给予的可帮助资料来学习,然后才能开始投入到项目中去。大家一起完成一个项目,才会高效有益,合作使得大家都可以用合理和相对较短的时间,完成庞大的项目。另外,我们也发现,项目及时差错是非常重要的。
成员5
@ -264,3 +317,4 @@ break;
[1] 严蔚敏, 吴伟民. 数据结构C语言版. 北京: 清华大学出版社, 2007.
[2]DATA STRUCTURES and ALGORITHM ANALISIS in C++
Loading…
Cancel
Save