本项目源码可在附录A中获取,创作不易,欢迎点赞关注
任 务 书
一、课程设计的基本要求
编写一个应用程序,实现迷宫的生成或求解过程。迷宫可以用文本字符绘 制(例如制表符号),也可以直接用图的邻接矩阵方式表示。
二、课程设计的主要内容(包含分工)
通过递归回溯算法实现了一个迷宫生成器。由于在课设设计中实现了一个 栈结构,因此该生成器可以生成任意大的迷宫而不会受系统调用栈的限制。 同时,为了测试迷宫的正确性和可解性,负责测试的组员人工测试多组数据。
小组成员具体分工如下:
组长–––负责项目的分工和总体设计,编制项目计划书、需求分析文档和 风险管理计划(见附录)并对文档做了文字和插图方面的贡献。同时,对项目 的联调环境提供技术支撑。同时提供了 DFS、BFS 算法的思路。
–––负责迷宫生成器需求分析和 C 编码实现。
–––负责迷宫求解器的需求分析和 C 编码实现。
–––负责人工测试程序,并利用合适的软件测试方法对测试的结果进行 记录,编写测试目标、测试用例,并撰写测试报告。
《数据结构》课程设计报告
一、目的
实现迷宫生成算法,如随机深度优先搜索。生成的迷宫可以以文本字符形 式进行绘制,并且可以选择不同的迷宫大小和复杂度。实现迷宫求解算法(深 度优先搜索)用户可以输入自定义的迷宫,程序将找到从起点到终点的最短 路。创建用户友好的命令行或图形用户界面,使用户能够轻松选择生成或求解 迷宫,并提供相关参数的输入。确保生成和求解算法的效率,尽量避免生成过 于复杂的迷宫时导致性能下降。同时,确保用户界面友好,能够清晰地展示迷 宫生成和求解的过程。
本课程设计的工作目标如下
1. 实现一个全功能的迷宫生成与求解应用程序,能够通过用户输入自定义 参数生成不同规模和复杂度的迷宫,并能够解决各类迷宫。
2. 提供清晰的用户界面,使用户能够轻松使用程序进行迷宫生成和求解, 同时展示算法的执行过程。
3. 在程序中充分体现迷宫生成和求解算法的原理,使得程序不仅是一个实 用工具,同时也是一个教育性的应用。
二、需求分析
对于本次课程设计的迷宫生成器,功能点分解包括输入输出等 9 个模块。 具体是:
1. 输入格式模版:
• 用户能够指定迷宫的尺寸(行数和列数),或者使用默认尺寸。
• 用户能够选择生成迷宫的算法,如随机深度优先搜索。
2. 输出格式模版:
• 生成的迷宫以文本字符形式输出,墙壁用"1"表示,路径用"0"表 示,入口用"2"表示,出口用"3"表示。
3. 递归操作:
• 在生成迷宫的过程中,可能需要使用递归来辅助实现深度优先搜 索等算法。
4. 迷宫墙壁设置:
• 提供函数或方法用于将迷宫中的某个位置设置为墙壁。
5. 迷宫墙壁清除:
• 提供函数或方法用于将迷宫中的某个位置清除,变为路径。
6. 坐标读写:
• 提供函数或方法用于读取和写入迷宫中某个位置的值。
7. 方向确定:
• 提供函数或方法用于确定某个节点相邻的四个方向。
8.随机数产生:
• 提供函数或方法用于产生随机数,用于在生成迷宫的过程中打乱 方向等。
9.测试结果导出:
• 将生成的迷宫结果以文本或其他格式导出,方便进一步分析和展 示。
对于迷宫求解器,以下是功能点分解:
1. 输入格式模版:
• 用户需要输入迷宫的行数和列数,以及每个元素的值,其中 0 表 示可走路径,1 表示迷宫墙体,2 表示终点。
2. 输出格式模版:
• 输出采用矩阵形式,其中路径用 "P" 表示,墙体用 "1" 表示, 其他位置用 "0" 表示。
3. 迷宫墙壁设置:
• 提供了函数 isValid 用于检查坐标是否在迷宫范围内,但并未提 供专门用于设置墙壁的函数。
4. 迷宫尺寸设置:
• 用户输入时设置了迷宫的行数和列数。
5. 坐标读写:
• 提供了 isValid 函数用于读取坐标是否在迷宫范围内,但并未提 供专门用于读写坐标值的函数。 6. 坐标验证:
• 提供了 isValid 函数用于验证坐标是否在迷宫范围内。
7. 方向确定:
• 使用了方向数组 directions 用于确定四个方向。
• 点。
8. 节点日志:
• 使用二维数组 path 记录了搜索到的路径节点。
9. 命令行交互:
• 使用了 printf 和 scanf 实现了命令行交互,用户可以输入迷宫的 尺寸、元素值和起始点。
10. 测试结果导出:
• 提供专门的测试结果导出功能。
三、概要设计
系统模块设计见图 3-1。本系统包含三个功能模块(迷宫初始化、迷宫生成 和迷宫求解),和一个用户界面模块。用户通过用户界面调用其他三个模块。
四、详细设计
1. 迷宫生成
(1) 基本定义
针对迷宫所需要数据类型进行设计。对于迷宫而言,首先应该确定的是尺 寸,可以使用全局宏定义一个尺寸规定的迷宫,同时定义迷宫的墙和路径:
#define H 10
#define L 10
#define WALL 1
#define PATH 0
之后,需要初始化迷宫将其用墙填满:
void init() {
for (int i = 0; i < H; i++) {
for (int j = 0; j < L; j++) {
maze[i][j] = WALL;
}
}
}
需要为迷宫设定一个出口与入口,去除两角,只在中间生成。由于迷宫的生成是一个递归的过程,所以需要将其放在递归之后以防被覆盖:
void exitandentry(){
int entrance = rand()%(L-2)+1;
int exit = rand()%(L-2)+1;
maze[0][entrance] = 2;
maze[H-1][exit] = 3;
}
在探索中需要确定探索的边界问题,因此先定义一个函数方便操作:
int Safe(int x, int y) {
return (x >= 0 && x < H && y >= 0 && y < L && maze[x][y] ==