AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

K0066. 魔法寻宝任务

中等通过率 76% · 提交 38 · 通过 29
DFS回溯矩阵枚举

小慕正在开发一个迷宫探索游戏,其中有一个核心关卡需要完成:玩家需要从指定的起点出发,找到藏在迷宫深处的宝藏,并且必须经过地图上所有可通行的空地恰好一次,最终抵达宝藏所在的位置。 迷宫的地图用一个 `grid` 表示,每个格子代表不同的地形: - 数字 `1` 表示玩家的起点。 - 数字 `2` 表示宝藏所在的终点。 - 数字 `0` 表示可以通行的空地。 - 数字 `-1` 表示,无法通行。 在游戏中,玩家只能朝上、下、左、右四个方向移动,且不能重复经过任何一块空地。小慕需要计算从起点到终点所有可能的路径数量,其中每条路径都必须经过每一块可以通行的空地。

提示:带虚线的词点一下有通俗解释。

输入描述

输入的第一行包含两个整数 `m` 和 `n`,表示网格的行数和列数 `(1 <= m * n <= 20)`。 接下来的 `m` 行中,每行包含 `n` 个整数,表示房间的布局。每个整数的值可以是以下之一: - `1`:表示起点。 - `2`:表示终点。 - `0`:表示可以通行的空地。 - `-1`:表示障碍物。

输出描述

输出一个整数,表示从起点到终点的所有不同路径数目。如果不存在路径,输出 `0`。

示例

示例 1

输入

3 4
1 0 0 0
0 0 0 0
0 0 2 -1

输出

2

说明:有以下两条路径: 1. `(0,0) -> (0,1) -> (0,2) -> (0,3) -> (1,3) -> (1,2) -> (1,1) -> (1,0) -> (2,0) -> (2,1) -> (2,2)` 2. `(0,0) -> (1,0) -> (2,0) -> (2,1) -> (1,1) -> (0,1) -> (0,2) -> (0,3) -> (1,3) -> (1,2) -> (2,2)`

示例 2

输入

3 4
1 0 0 0
0 0 0 0
0 0 0 2

输出

4

说明:有以下四条路径: 1. `(0,0) -> (0,1) -> (0,2) -> (0,3) -> (1,3) -> (1,2) -> (1,1) -> (1,0) -> (2,0) -> (2,1) -> (2,2) -> (2,3)` 2. `(0,0) -> (0,1) -> (1,1) -> (1,0) -> (2,0) -> (2,1) -> (2,2) -> (1,2) -> (0,2) -> (0,3) -> (1,3) -> (2,3)` 3. `(0,0) -> (1,0) -> (2,0) -> (2,1) -> (2,2) -> (1,2) -> (1,1) -> (0,1) -> (0,2) -> (0,3) -> (1,3) -> (2,3)` 4. `(0,0) -> (1,0) -> (2,0) -> (2,1) -> (1,1) -> (0,1) -> (0,2) -> (0,3) -> (1,3) -> (1,2) -> (2,2) -> (2,3)`

示例 3

输入

2 2
0 1
2 0

输出

0

说明:没有一条路径能完全穿过每一个空的方格一次。

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
示例1:3行4列网格 起点(1) → 终点(2),必须走完所有0,障碍-1 1 0 0 0 0 0 0 0 0 0 2 -1 路径1(蓝色虚线) 路径2(红色虚线) 两条路径都走过了所有0,且不重复,最终到达终点2 注:-1障碍物不可通行,路径需绕开
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「魔法寻宝任务」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。