From 1185547679676052ce85fb74b1877501c815a436 Mon Sep 17 00:00:00 2001 From: Tingyu Meng <29924168887@qq.com> Date: Mon, 3 Jul 2023 14:42:30 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E8=AE=A1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 162 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 108 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 3701a73..893a8ca 100644 --- a/README.md +++ b/README.md @@ -57,53 +57,121 @@ # 2. 系统设计 ## 2.1 概要设计 - -系统划分为几个模块,可以画模块图。 - -逐个说明每个模块的功能(输入、输出、做什么,这里不写怎么做)。 - - - +系统主要划分为6个模块.首先用宽搜来寻找最短路径的长度,然后用深搜来找出所有路径,并且标记出其中的最短的路径。其中宽搜采用的是队列,深搜采用的是栈。思路都是去寻找可以走的几个方向,逐个判断就行了。 ## 2.2 数据结构设计 - -首先,分析对比几种可选的数据结构设计方案。如图可以采用邻接矩阵,也可以采用邻接表,表示集合可以用普通的查找表,还可以用不相交集。给出每一种设计方案的特点(优势、不足等)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 - -### (1)xxx结构 - -给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。多个数据结构,逐一列出。 - -### (2)xxx结构 - -给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。 - -### - +设计步骤: +(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 算法设计 -首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 - -### (1)XXX算法 - -给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。 - -### (2)XXX算法 - -给出核心算法的设计,包括伪代码或流程图。 - +我们实现了一种可实现数据结构,并且运用的数据结构都能完整的实现生成所需迷宫。考虑到我们现有的开发工具只有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); 时间复杂度 O(m*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<