题目描述
给定一个 n*m 的二维整数数组,用来表示一个迷宫,数组中只包含 . 或 #,其中 . 表示可以走的路,# 表示不可通过的墙壁。 最初,有一个人位于左上角 (0, 0) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。 请问,该人从左上角移动至右下角处,至少需要移动多少次。 数据保证 (0, 0) 处和 (n-1, m-1) 处的数字为 0,且一定至少存在一条通路。
输入格式 第一行包含两个整数 n 和 m。 接下来 n 行,每行包含 m(. 或 #),表示完整的二维数组迷宫。
输出格式 输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围 1≤n,m≤100
输入样例
5 5
.#...
#..#.
.....
###..
....#
输出样例
8
算法思路
采用'递归深入探索路径 + 回溯恢复状态'的策略,穷举从起点到终点的所有可能路径,最终筛选出最短的那条。
拆解成 4 个关键步骤(以迷宫为例):
- 终止条件:到达终点 / 越界 / 不合法,停止当前路径的探索;
- 遍历方向:尝试所有可选的移动方向(如下右上左);
- 标记 + 递归:标记当前位置为'已访问',递归探索下一个位置;
- 回溯:递归返回后,恢复当前位置为'未访问',让其他路径复用该位置。
代码实现
1. 导入模块与配置
import sys
sys.setrecursionlimit(100000)
作用:调整 Python 默认的递归最大深度,防止栈溢出错误(RecursionError)。
2. 全局变量初始化
n, m = 0, 0
a = [[0 for _ in range(100)] for _ in range(100)]
vis = [[False for _ in range(100)] for _ in range()]
ans =
= [(, ), (, ), (-, ), (, -)]

