1、湖南科技大学课程设计报告题目:_院 系:_专业班级:_学 号:_学生姓名:_指导教师:_年 月 日漫步迷宫MAZE1、问题分析(1)迷宫是一个 m 行 n 列的方格,可以用二维数组来存储迷宫。迷宫采用 matrix 类型的二维数组 A 表示。A.rownum 和 A.colnum 分别表示迷宫的实际行数和列数。而 A.mazeij表示迷宫中第 i 行第 j列的一个方格。问题描述上面说有斜线的方格表示不可通的(如图1.0) ,对于方格通与不通是两种情况,可以用数字 0 表示这个方格是通的即 A.mazeij=0,用 1 表示这个方格是不可通的即 A.mazeij=1。这样就可以把迷宫在计算机里面
2、存储起来,对于最外面那一层,可以通过添加一个“外墙” ,即把整个迷宫用数字 1 进行包围。如图1.1,描述的就是一个 610 的迷宫: 图 1.0(2)由于要寻找从入口到出口的一条最短路径,那么只要我们把迷宫看作是一个图的结构,则问题就转化为了寻找从入口点到出口点的一条最短路径的问题,那么我们只需要从入口点出发,对图进行广度优先搜索遍历,直到遇到出口或者是遍历完毕也没有找到出口点为止。然后记下走过的路径,即可以求得最短路径。1 1 1 1 1 1 1 1 1 1 1 11 0 1 1 1 1 1 1 1 1 1 11 0 1 0 0 1 0 0 0 1 1 11 0 0 0 1 1 0 1 0
3、 0 1 11 0 1 1 0 0 0 1 1 0 1 11 0 0 0 0 1 0 0 0 0 1 11 1 1 1 1 1 1 1 1 0 0 11 1 1 1 1 1 1 1 1 1 1 1图 1.1(3)基于上述的分析,我们要用到图的遍历,所以必须把二维数组 A 转化为以 adjlist 类型的邻接表表示的图结构 G。将迷宫的每个格子都看做一个顶点。不可通行的方格都是孤立顶点;相邻的可通方格所对应的顶点间是有边相连的。因此,迷宫可以转化为有mn 个顶点以及无向边够成的图了。这个问题转化:判定入口顶点与出口顶点是不是在同一个连通分量里面。在图结构 G 中间,G.adjk表示编号为 k 的
4、顶点的邻接情况的单链表的头指针;G.vexnum 表示图 G 中的实际顶点数,而且具有如下关系:G.vexnum = A.rownum*A.colnum。(4)为了避免迷宫数据的重复输入,所以将 A 自动转换为G。设计个算法 create_adjlist(A,G)。以行主序对图的顶点进行编号,顶点编号(即 vexno)和迷宫中方格的坐标关系有:Vexno = (row - 1) * n + col;Row = (vexno 1) / n + 1;Col = (vexno 1) % n + 1;(5)在进行广度优先搜索遍历时求解最短路径时,我们还需要设置一个队列 queue 作为辅助数据结构;
5、路径采用一个整数数组pred 来表示。这两个结构存储的类型均为 lsit 类型。队列 queue 应该设置 front 和 rear 分别指示队首和队尾,queuek表示第 k 个入队的顶点编号。采用 pred记录路径,predi表示顶点 i 在广度优先搜索遍历的过程中的前驱顶点的编号,它表明是经过边(predi , i)达到顶点 i 的。搜索成功后可以根据(4)中的公式到推出方格的坐标。2、数据结构描述#define MAX_WIDTH 20/迷宫地图最大的宽度#define MAX_HEIGHT 20 /迷宫地图的最大高度/定义迷宫地图typedef struct MazeTypeint
6、mazeMAX_HEIGHTMAX_WIDTH; /矩阵 int rownum;/行总数int colnum;/列总数MazeType;#define MAX_VERTEX_NUM 200 /定义最大顶点个数/定义图节点Typedef struct ArcCellint adj; /VRType 是顶点关系类型 对无权图,用 1 或 0 表示相邻否ArcCell,AdjMatrixMAX_VERTEX_NUM MAX_VERTEX_NUM;typedef structint vexsMAX_VERTEX_NUM; /顶点向量AdjMatrix arcs; /邻接矩阵int vexnum,arc
7、num; /图当前的顶点数和边数MGraph;typedef struct ArcNodeint adjvex; /该弧所指向的顶点的位置struct ArcNode *nextarc; /指向下一条弧的指针int no;/定义单链队列 队列链式存储结构typedef struct QNode /定义队列上的节点int no; /节点的编号struct QNode *next; /指向下一个节点QNode,*QueuePtr; typedef structQueuePtr front; /队头指针QueuePtr rear; /队尾指针Queue;3、算法设计Create_adjList(MazeType i G.vexnum; +i)for(i = 0; I A.rownum ; i+) for(j = 0 ;j A.colnum ; j+)