☰
C语言数据结构课程设计:老鼠走迷宫升级版(DFS+BFS+迷宫文件)
2026/10/8 20:07:31 网站建设 项目流程

简介:面向C语言与数据结构课程设计的“老鼠走迷宫游戏升级版”项目包,提供了一个可运行、可修改的迷宫游戏实现。程序启动后显示迷宫地图,玩家用方向键控制老鼠在限定时间内走到粮仓,并配有胜负判定;同时支持编辑迷宫、求所有路径及最短路径,适合课程设计、期末作业或数据结构算法练习使用。资源包为zip压缩格式,共5个文件,包含1个cpp源代码、1个exe演示程序以及3个txt文本文件,整体大小约50KB。其中cpp为完整项目源码,exe可直接运行查看效果,txt文件主要用于存放迷宫地图数据或算法输出,便于对照学习和二次开发。该资源已有3889人学习或下载,既能帮助理解回溯、深度优先搜索等经典路径搜索算法,也能为迷宫编辑、最短路径求解等模块提供直接代码参考。压缩包结构简洁,适合需要快速上手并完成课设报告的学生取用。

1. 老鼠走迷宫游戏升级版课程设计:先回答“升级”升在哪,再谈写代码

「老鼠走迷宫游戏升级版课程设计(c语言+数据结构)源代码+迷宫文件」放在课程设计场景里,懂行的第一反应不是“画个地图让符号走两步”,而是它把 C 语言、数据结构、文件解析、自动寻路串成了一份完整作业。升级版通常意味着多张迷宫地图、难度切换、能自动演示寻路,这些正是答辩老师最爱追问的位置:栈用在哪、队列用在哪、地图怎么从文件读进来。

常见做法是用 char 二维数组存地图,栈做深度优先搜索找通路,队列做广度优先搜索找最短路径,迷宫放在独立 txt 文件中而不是写死在代码里。这篇笔记适合正在做课设的学生,也适合辅导课设、想快速搭出可复现参考实现的人。真正难的从来不是跑通,而是每个功能都能说出数据结构依据,并把文件读取、坐标回溯、路径还原这些坑提前排掉。

2. 先选数据结构再动手:地图模型、栈与队列的分工、递归不是最优解

2.1 迷宫地图用什么存:char 二维数组与坐标结构体

迷宫的本质是一张二维网格,最直接的模型是char maze[ROWS][COLS],'#'表示墙、空格表示通路、'S'表示起点、'E'表示终点。用 char 不用 int 的理由很实际:迷宫文件按字符读入,char 直接保留文件里的原始字符,打印调试、与文本对照都省事;int 反而要在读写时多做一层字符到数字的映射。这一层小差异在排查“地图某一行少了个空格”时感受特别明显。

固定数组的大小一直是课设里的选择题。开 100×100,大地图放不下;开 1000×1000,小地图又浪费。标准做法是读文件后按实际行列数malloc动态分配,这也是“升级版”和基础版最明显的分界线。如果老师明确要求代码尽量简单,固定大数组也能交差,但答辩时必须能接住一个问题:地图超过数组上限怎么办。能答出“改成动态分配,行指针逐个 malloc,最后 free”就及格,所以我还是推荐直接在代码里写动态分配。

建议把坐标和迷宫整体封装成两个结构体:

typedef struct Point { int row; int col; } Point; typedef struct { char name[32]; // 关卡名 int rows, cols; // 实际行列数 char **map; // 动态二维数组 Point start; // 起点 S Point end; // 终点 E int totalSteps; // 玩家手动走的总步数 } Maze;

逻辑说明:Point把行、列绑在一起,后面栈和队列的元素类型都是Point,函数传递不必拆成两个 int;Maze把地图、规模、起终点、步数打包,所有对地图操作的函数只传一个Maze *。totalSteps在手动闯关模式下累加,最后与 BFS 最短步数对比,这是课程设计报告里最有说服力的数据。

参数说明:char **map是行指针数组,每行由malloc(cols + 1)分配,加 1 是因为要在行尾写\0,否则打印地图时整行会往外串。rows / cols必须来自文件解析结果,不能拍脑袋写定值;name[32]存关卡标题,多关卡切换菜单时直接显示它。

2.2 DFS 为什么配栈:回溯就是“后走的路先退”

深度优先搜索的流程一句话就能说清:从起点出发,朝一个方向一路走,走不通就退回最近一个还没试完所有方向的岔路口,换个方向继续。这个“退回”操作和栈的后进先出完全一致——前进时压栈,碰壁时弹栈,弹出的正好是最近一个还能继续扩展的点。

递归同样能写 DFS,因为递归底层就是系统栈。但课设里我更推荐手写栈,理由有三个。第一,递归深度约等于探索路径长度,地图到 200×200 时系统栈很容易爆,程序直接崩溃;手写栈的深度只受自己数组大小限制。第二,手写栈的内容在调试器里一目了然,答辩时能直接指出“这就是我用到的栈结构”;用递归反而把数据结构藏进了编译器。第三,课程设计考察的就是数据结构掌握程度,手写栈等于把得分点摆在明面上。

方向数组和手写栈的实现如下:

#define MAX_STACK 4096 typedef struct { Point data[MAX_STACK]; int top; } Stack; void push(Stack *s, Point p) { if (s->top >= MAX_STACK) return; // 栈满保护 s->data[s->top++] = p; } Point pop(Stack *s) { return s->data[--s->top]; } // 上、下、左、右:行偏移与列偏移 int dr[4] = {-1, 1, 0, 0}; int dc[4] = {0, 0, -1, 1};

逻辑说明:push把坐标写入数组并把top加一,pop先减top再取出元素。top指向的是“下一个空位”而不是最后一个元素,这是最容易写错的地方。MAX_STACK = 4096对 50×50、100×100 的课设迷宫完全够用;如果地图更大,把data换成malloc动态扩容版本即可,设计说明里加一句“可扩展点”能加分。

参数说明:方向数组是迷宫寻路里最值得调整的参数。dr[4] / dc[4]的顺序决定 DFS 先探哪个方向:当前顺序是上、下、左、右。想改变搜索偏好只改这一处即可,不影响主逻辑。要注意行坐标向下增长、列坐标向右增长,方向数组必须与这个坐标系对应,写反了就是越界访问。

2.3 BFS 为什么配队列:按层扩散,第一次到达就是最短路径

广度优先搜索按“离起点的步数”逐层扩展:先处理完距离为 1 的所有格子,再处理距离为 2 的格子,依此类推。这种“先来先扩展”的顺序正是队列的先进先出。因为层数单调递增,BFS 第一次碰到终点时,当前层数一定是最短步数——这是 DFS 给不了的保证。

BFS 要多维护一样东西:前驱数组。每个格子要记录“我是从哪个格子走来的”,也就是prev,否则找到终点后无法逆推出完整路径。DFS 靠栈回溯能天然留下路径,BFS 必须显式记录prev,这是很多同学把 BFS 写通但打印不出路径的原因。visited负责防止绕圈,prev负责最后还原路线,两个数组缺一不可,别想着省一个。

2.4 DFS 和 BFS 怎么选:一张对比表

对比项DFSBFS
配套数据结构栈(后进先出)队列(先进先出)
路径结果找到一条通路,不保证最短第一次到达终点即最短路径
空间占用与探索深度相关,通常较小与迷宫宽度相关,层多时较大
演示效果深入到底再回头,展示回溯过程一圈圈扩散,展示“层”的概念
代码复杂度手写栈加方向数组即可需要额外维护 prev 前驱数组

课设里我通常两种都实现,主菜单做成“手动闯关 / DFS 自动演示 / BFS 自动演示”三个入口。这不是功能堆砌,而是让同一份代码能正面回答“栈和队列分别用在哪”,也是标题里“升级版”真正的分量所在。

3. 迷宫文件读取与解析:把 txt 地图变成能跑的程序

3.1 迷宫文件格式约定:先约定再写代码

“升级版”最基本的要求,是地图不写死在源码里,而是从外部迷宫文件读取。常见格式有两种:一是第一行写rows cols,后面跟着字符地图;二是直接给字符地图,由程序自己统计行列数。我建议用显式行列数的版本,解析逻辑清晰,后续扩展关卡难度也方便。

地图文件内容示例:

5 5 ##### #S # # # # # E# #####

约定:#为墙,空格为通路,S为起点,E为终点。注意文件末尾建议保留一个换行符,某些编辑器最后一行不换行时,fgets读出来的行长会不一致,差一个字符就够让渲染错位。

标题里既然带了“迷宫文件”,说明交付物中应当有可替换的地图文件。这点在课程设计报告里值得专门写一句:换地图只改 txt、不改代码,这是迷宫文件存在的价值,也是升级版区别于“地图写死在数组里”的标志。

3.2 用 fgets 按行读取:避开三个读文件陷阱

读取地图的参考实现:

int loadMaze(const char *filename, Maze *maze) { FILE *fp = fopen(filename, "r"); if (!fp) return -1; char line[512]; fgets(line, sizeof(line), fp); sscanf(line, "%d %d", &maze->rows, &maze->cols); maze->map = (char **)malloc(maze->rows * sizeof(char *)); for (int i = 0; i < maze->rows; i++) { maze->map[i] = (char *)malloc((maze->cols + 1) * sizeof(char)); } for (int i = 0; i < maze->rows; i++) { if (!fgets(line, sizeof(line), fp)) break; int len = strlen(line); if (len > 0 && line[len - 1] == '\n') line[len - 1] = '\0'; strncpy(maze->map[i], line, maze->cols); maze->map[i][maze->cols] = '\0'; for (int j = 0; j < maze->cols; j++) { if (line[j] == 'S') { maze->start.row = i; maze->start.col = j; } if (line[j] == 'E') { maze->end.row = i; maze->end.col = j; } } } fclose(fp); return 0; }

逻辑说明:第一行用sscanf读行列数;随后逐行读取,每行去掉末尾的\n;strncpy只拷贝前cols个字符,防止行尾多余字符混入地图。读取每一行的同时顺手记录 S 和 E 的位置,避免二次遍历。

参数说明:line[512]对课设地图足够,列数超过 511 时要把缓冲区加大。fgets会保留换行符,所以line[len-1] == '\n'的判断必须做。这里最容易踩的坑是strncpy不会自动补\0,所以紧接着必须手动写maze->map[i][maze->cols] = '\0',否则 printf 打印这一行时会一路读到下一个内存块的垃圾数据。

常见做法里还有三个陷阱要提前处理。一是逐字符读取:fscanf(fp, "%c", &ch)看起来直观,但会把\r、\n、空格全部吸入,Windows 下换行是\r\n,逐字符读取会多出一个看不见的\r,地图和障碍判断全部错乱;坚持fgets按行读能直接避开。二是文件编码:源文件或迷宫 txt 保存为 UTF-8 带 BOM 时,第一行前三个字节是多出来的,sscanf解析行列数会失败;用记事本另存为 ANSI,或在代码里检测并跳过 BOM 头。三是行尾空白:地图空白处如果写成空格没问题,但编辑器若在行尾补了空格,行长就不一致了;strncpy按固定cols截断正好兜住这个情况。

3.3 地图合法性校验:起点、终点、边界是否齐全

迷宫文件是人写的,就一定会写错。至少校验三件事:S 和 E 是否存在、最外圈是否全是#、每行长度是否一致。参考代码:

int checkMaze(Maze *m) { int hasStart = 0, hasEnd = 0; for (int i = 0; i < m->rows; i++) { for (int j = 0; j < m->cols; j++) { if (m->map[i][j] == 'S') hasStart = 1; if (m->map[i][j] == 'E') hasEnd = 1; if (i == 0 || j == 0 || i == m->rows - 1 || j == m->cols - 1) { if (m->map[i][j] != '#') return -2; } } } if (!hasStart || !hasEnd) return -1; return 0; }

逻辑说明:边界必须全部是墙,否则玩家可以直接走出地图,寻路算法也会越界。S、E 缺失时返回明确错误码,加载函数据此打印中文提示,不要等到寻路函数返回一个莫名奇妙的负数才去排查。

参数说明:这里用-1、-2区分“缺起终点”和“边界不闭合”两类错误。工程上我更建议返回错误描述字符串,比如"start point not found",主函数直接输出它。答辩时展示这个校验逻辑,等于告诉老师“我处理过脏数据”,这种工程意识在课程设计评分里很吃香。

3.4 控制台渲染:清屏、光标定位与显示

读进来的地图要画到控制台。最省事的写法是system("cls")每次清屏重画,但玩家每走一步整个屏幕闪一下,体验很糟。更平滑的做法是借助 Windows 控制台 API 把光标挪回左上角再重绘:

#include <windows.h> void gotoxy(int row, int col) { COORD pos = {col, row}; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, pos); }

逻辑说明:COORD是 Windows 的坐标结构体,SetConsoleCursorPosition把光标移过去。每次移动后先gotoxy(0, 0)再打印整个地图,整个画面在原地刷新,看起来是平滑的。

参数说明:COORD的字段顺序是 X 对应列、Y 对应行,和maze[row][col]的下标习惯相反,写反的后果是光标到处乱跳。跨平台方案是 ANSI 转义序列\033[H,但 Windows 旧版本控制台默认不开启,需要额外调用SetConsoleMode启用,课设阶段直接用windows.h最省事。

4. 让老鼠自己找路:DFS 通路、BFS 最短路径与路径回放

4.1 手写栈 DFS 的完整函数

DFS 不只要“能走通”,还得把路径记下来用于显示。实现如下:

int dfsSolve(Maze *m, Point path[], int *pathLen) { Stack s; s.top = 0; int visited[MAX_ROWS][MAX_COLS] = {0}; Point cur = m->start; push(&s, cur); visited[cur.row][cur.col] = 1; while (s.top > 0) { cur = pop(&s); path[(*pathLen)++] = cur; if (cur.row == m->end.row && cur.col == m->end.col) return 1; for (int k = 0; k < 4; k++) { int nr = cur.row + dr[k]; int nc = cur.col + dc[k]; if (nr < 0 || nr >= m->rows || nc < 0 || nc >= m->cols) continue; if (m->map[nr][nc] == '#') continue; if (visited[nr][nc]) continue; visited[nr][nc] = 1; push(&s, (Point){nr, nc}); } } return 0; }

逻辑说明:起点压栈,然后循环弹栈并扩展四个方向。visited必须在压栈时立刻标记,而不是弹栈时才标记,否则同一个点会被重复压入很多次,程序轻则变慢,重则死循环。path记录原始的探索顺序,里面包含探索过程中的回头路径,不是最终可走的通路。

参数说明:路径数组path和pathLen由调用方提供,dfsSolve只往里面写数据。MAX_ROWS / MAX_COLS在这里是编译期常量,换成动态数组时记得用memset清零。返回值 1 表示找到通路,0 表示无解,调用方必须区分,不能直接打印空路径。

4.2 队列 BFS 与 prev 前驱数组

BFS 是升级版的真正卖点。它的核心不是“找通路”,而是“找最短路径”,并且能打印出路径本身:

#define MAX_QUEUE 4096 typedef struct { Point data[MAX_QUEUE]; int head, tail; } Queue; void enqueue(Queue *q, Point p) { q->data[q->tail++] = p; } Point dequeue(Queue *q) { return q->data[q->head++]; } int bfsSolve(Maze *m, Point path[], int *pathLen) { Queue q = {0}; int visited[MAX_ROWS][MAX_COLS] = {0}; Point prev[MAX_ROWS][MAX_COLS]; Point cur; enqueue(&q, m->start); visited[m->start.row][m->start.col] = 1; prev[m->start.row][m->start.col] = (Point){-1, -1}; while (q.head < q.tail) { cur = dequeue(&q); if (cur.row == m->end.row && cur.col == m->end.col) break; for (int k = 0; k < 4; k++) { int nr = cur.row + dr[k]; int nc = cur.col + dc[k]; if (nr < 0 || nr >= m->rows || nc < 0 || nc >= m->cols) continue; if (m->map[nr][nc] == '#') continue; if (visited[nr][nc]) continue; visited[nr][nc] = 1; prev[nr][nc] = cur; enqueue(&q, (Point){nr, nc}); } } cur = m->end; while (cur.row != -1) { path[(*pathLen)++] = cur; cur = prev[cur.row][cur.col]; } for (int i = 0; i < *pathLen / 2; i++) { Point tmp = path[i]; path[i] = path[*pathLen - 1 - i]; path[*pathLen - 1 - i] = tmp; } return 1; }

逻辑说明:队列用简单的数组实现,head指向队头、tail指向队尾,课设场景足够。prev[cur.row][cur.col] = cur是整段代码的关键,它记录“当前格子是从哪个格子来的”。遇到终点立即break是正确的,因为 BFS 第一次到达终点时必定最短,多扩展一圈都是浪费。

参数说明:逆推前驱后,path的顺序是从终点到起点,所以需要双指针翻转一次。这条路径才是真正的“最短路径”,可以直接用于回放和步数统计。MAX_QUEUE = 4096与栈同等级别,如果地图特别大,队列元素也可能撑满,同样改成动态数组即可。

4.3 路径回放:把答案画回地图上

找到路径之后,要在界面上逐步展示才有演示效果。常见做法是复制一份地图,每走一步把当前格子替换成*,暂停一小段时间再画下一步:

void replayPath(Maze *m, Point path[], int len) { for (int i = 0; i < len; i++) { gotoxy(0, 0); printMaze(m); m->map[path[i].row][path[i].col] = '*'; Sleep(200); } gotoxy(0, 0); printMaze(m); }

逻辑说明:replayPath在副本地图上把路径字符改写为*,配合gotoxy原地重绘形成动画。Sleep(200)让每一步停留 0.2 秒,观众能看清走向。BFS 路径回放时,可以看到路径像水波一样从起点扩散到终点,视觉效果比瞬间出答案好得多。

参数说明:Sleep的毫秒数可以做成可调参数,地图大的时候设 100、地图小的时候设 300。注意Sleep是 Windows API,Linux 下要换成usleep(200000),跨平台可以用宏封装一层。

4.4 步数统计与通关判定

手动闯关模式下,玩家每走一步totalSteps加一;到达 E 时打印总步数,并和 BFS 最短步数对比。这一步是课程设计报告里最直接的数据:

int movePlayer(Maze *m, int nr, int nc) { if (m->map[nr][nc] == '#') return 0; if (m->map[nr][nc] == 'E') { m->totalSteps++; printf("通关!总步数:%d\n", m->totalSteps); printf("BFS 最短步数:%d\n", bfsSteps); return 2; } m->map[m->start.row][m->start.col] = ' '; m->start.row = nr; m->start.col = nc; m->map[nr][nc] = 'S'; m->totalSteps++; return 1; }

逻辑说明:撞墙返回 0,到达终点返回 2,正常移动返回 1。到达终点时打印两行数据:玩家实际步数和 BFS 最短步数。bfsSteps在进入手动模式前预先算好,这样玩家一通关就能看到对比,不用等寻路。

参数说明:movePlayer通过m->start维护玩家当前位置,移动前先把旧位置写成空格,再在新位置写S,顺序反了会把自己覆盖掉。这里还有一个 C 语言程序常见问题:有时通关提示迟迟不出现,要等程序退出才显示,这是stdout行缓冲导致的。控制台在非交互模式下不会立刻刷出内容,在printf后补一行fflush(stdout)即可。

5. 避坑:迷宫课设最容易翻车的 5 个现场

课程设计里很多问题不在算法本身,而在环境、文件、编码这些“玄学”层面。下面五条是我见过的翻车现场,按现象、原因、解决三步写。

5.1 fopen 一直返回 NULL:路径反斜杠被 C 语言吃掉了

现象:代码在教室电脑上跑,fopen("D:\课程设计\maze1.txt", "r")一直返回 NULL,地图怎么都加载不出来。

原因:C 语言字符串里\是转义字符,\课会被解析成非法转义,路径根本不是你想的那个路径。这是 C 语言新手必踩的坑。

解决:把所有反斜杠改成正斜杠"D:/课程设计/maze1.txt",或者写成双反斜杠"D:\\课程设计\\maze1.txt"。最稳的做法是让迷宫文件和.exe放在同一目录,用相对路径"maze1.txt",既省事又避免路径问题。另外注意fopen的当前工作目录是“启动程序时所在的目录”,不是.exe所在目录,用绝对路径调试时尤其容易忽视。

5.2 中文乱码、行列数解析失败:UTF-8 带 BOM 和 CRLF 在捣乱

现象:用记事本写的迷宫 txt 在 Dev-C++ 里跑,第一行行列数读成乱码,sscanf解析失败;或者打印地图时每行末尾多出一个莫名其妙的字符。

原因:记事本默认保存 UTF-8 带 BOM,前三个字节EF BB BF被fgets读进line[0],sscanf("5 5")当然失败。Windows 下换行是\r\n,逐字符读取会吸入\r,坐标判断全部错乱。

解决:设计一个skipBOM()函数,打开文件后先读前三个字节,若等于EF BB BF就跳过;或者直接要求迷宫文件保存为 ANSI 编码。行尾处理统一用fgets后判断\n去掉,再顺手去掉\r。答辩演示时最保险的做法是:交付包里附一个说明,写明“请用记事本另存为 ANSI 格式”,并在加载失败时打印错误码。这一条能救回一半以上的现场翻车。

5.3 寻路死循环:visited 标记时机不对,走了回头路

现象:DFS 一跑就卡死,程序像是“冻住”了,任务管理器里能看到 CPU 占满。

原因:visited在弹出栈时才标记,导致同一个格子可能被周围多个格子再次压入,反复试探形成环路;或者方向数组写成了上下左右加四个斜角,共 8 个方向,迷宫墙角的缝隙被“钻”了进去。

解决:visited在压栈/入队时立刻标记,不要等到出栈再标记。方向数组只用 4 个方向,并检查dr[4] / dc[4]是否与“行向下、列向右”匹配。遇到卡死先别急着怀疑算法,在while循环里加一个步数计数器,超过rows * cols就强制退出并打印“疑似死循环”,就能快速定位。

5.4 BFS 路径穿墙:方向数错了,斜角绕过了墙角

现象:BFS 算出来的“最短路径”横穿墙角,或者路径对角线穿过墙,看起来完全不合理。

原因:dr/dc数组给了 8 个方向组合,老鼠一步可以斜着走,斜角会绕过墙的拐角判定。BFS 认为这是合法动作,但迷宫视觉上就是穿模了。

解决:只保留上下左右 4 个方向。如果确实想支持斜角移动,必须同时检查两个相邻的正交格子是否都是通路(比如走右上斜角,要求正上方和正右方都不是墙),并且把斜角步长按√2计入代价。课设阶段不建议开这个复杂度,4 方向已经足够展示数据结构。这里顺带说一句:如果出现路径长度比预期短很多,先怀疑方向数组,而不是怀疑 BFS 写错了。

5.5 地图打印错位、最后一行消失:fgets 行尾处理和 \0 补齐

现象:地图打印出来某一行少一个字符,或者整行后面跟着一串乱码;改成大迷宫后,最后一行直接消失。

原因:fgets读到最后一行如果没有换行符,line[len-1]不是\n,直接去掉\n的操作不会执行;strncpy又不自动补\0,字符串结尾位置写进了垃圾字符。行数不足时,for循环里break提前退出,而map[i]仍然是未初始化的野指针。

解决:读行后先检查len > 0再处理\n,strncpy之后立即手动补\0。处理完所有行后,再遍历一遍检查map[0]到map[rows-1]是否都非空,遇到空行直接报错。这组检查写进checkMaze,加载阶段就把问题暴露出来,不要拖到渲染阶段才看到花屏。

血泪经验总结成一句话:课设代码里 70% 的 bug 不在算法,在文件读写和编码。把这些检查写进代码,比事后用调试器追半天要划算得多。

6. 从“能跑”到“能答辩”:通关日志、多关卡切换与验证技巧

6.1 通关日志:用一句话把验证数据写进报告

手动闯关模式通关时,除了在屏幕上打印步数,我还会把结果追加写进result.txt:

FILE *fp = fopen("result.txt", "a"); fprintf(fp, "%s 玩家步数=%d BFS最短=%d\n", maze->name, maze->totalSteps, bfsSteps); fclose(fp);

这一行日志的价值不在程序本身,而在课程设计报告。答辩时直接说“同一个迷宫我手动走了 37 步,BFS 只走 17 步”,比空口说“算法很高效”有力得多。多跑几个迷宫,日志就是现成的实验数据表。这也算最简单的源代码管理习惯:每个版本留一份运行日志,返工时有据可查。

6.2 多关卡切换:菜单里按难度分组

把迷宫文件按难度命名,比如easy_1.txt、normal_1.txt、hard_1.txt,用菜单让玩家选择关卡名称,loadMaze接收文件名参数即可,函数内部完全不用改。这也是迷宫文件存在的意义:地图与代码解耦,加关卡只加文件。

6.3 验证技巧:已知答案的迷宫和一键自检

验证 BFS 是否真的输出最短路径,最简单的方法是构造一个 L 形走廊的已知答案迷宫,比如从起点到终点必须绕一个直角弯,正确答案就是那几条确定的拐弯路径。跑一次,BFS 输出步数与手算一致,算法就是对的。再准备一个无解迷宫(终点被墙围死),确认程序能正确提示“无解”而不是打印空路径。把这两个测试迷宫连同测试结果一起写进报告,就是一份完整的验证记录。

我当年做课设时,代码在自己电脑上跑得好好的,答辩电脑一打开就乱码——源文件是 UTF-8,教室系统控制台代码页是 GBK,菜单全变问号。后来我养成交付前自查三件事:路径全部用正斜杠、迷宫文件统一 ANSI 编码、每个功能留一张运行截图。这三件事值回票价,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询