学习目标与前置知识
- 明确本题的搜索状态、合法选择和终止条件,并完成可运行的 C++17 解答。
- 用边界输入解释下面列出的常见错误,确认撤销、去重或最短距离的正确性。
- 前置:本章相关知识,以及 C++ 函数、数组/容器和递归;BFS 题还需要队列。
题目描述
在 N 行 M 列的网格中有 T 个障碍。从起点走到终点,每次只能向上、下、左、右移动一格,不可走出网格、穿过障碍或重复经过同一个格子。求不同路径的总数。起点没有障碍,终点可能是障碍。
本 Lab 保留原题的标准输入/输出合同。
输入格式
第一行 N M T;第二行起点与终点坐标 sx sy fx fy;之后 T 行每行一个障碍坐标。所有坐标从 1 开始。
输出格式
输出合法路径总数。若终点被障碍封住或不可达,输出 0。起终点相同时,不移动就是一条路径。
数据范围
1 <= N,M <= 5,1 <= T <= 10,坐标均在网格内。障碍重复描述不会增加可走格子。
样例输入
text
2 2 1
1 1 2 2
1 2样例输出
text
1状态与边界
当前位置与本条路径已经经过的格子共同构成状态;visited不是整次搜索的永久标记。
到达终点应立即计数并返回;一条分支结束后必须恢复visited,让其他路径能够使用该格子。
复杂度目标
最坏时间 O(4^(NM)),辅助空间 O(NM)。计数使用64位整数。
编写与测试
修改 student/main.cpp 中的 solve,保留现有读写框架。调试信息写入标准错误,标准输出只保留答案。测试清单和分值以 tests/cases.json 为准,总分 100 分;输入均符合本页约定。
在仓库根目录执行:
powershell
pnpm lab:run -- labs/chapter-15/exercise/E-15-06-maze-paths
pnpm lab:score -- labs/chapter-15/exercise/E-15-06-maze-paths进入本 Lab 目录后也可运行 make run。作者核验命令为:
powershell
pnpm lab:verify -- labs/chapter-15/exercise/E-15-06-maze-paths完成清单
思考与复盘
- 哪些信息必须随搜索路径恢复,哪些信息可以在整次搜索中保留?
- 删除本页提到的一条约束或剪枝,会得到错误答案,还是仅仅变慢?用一个输入说明。
- 输入达到上限时,时间、递归深度和输出量分别由什么决定?
题目来源与课程化说明
来源:洛谷 P1605 迷宫。本 Lab 独立编写参考实现和测试数据,并按课程环境重新表述题面;完整参考代码位于 solution/main.cpp,不复制第三方题解或隐藏测试。