不同路径数
给定一个 n × m
的二维矩阵,其中的每个元素都是一个 [1,9]
之间的正整数
从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走
走了 k
次后,经过的元素会构成一个 k + 1
位数。
请求出一共可以走出多少个不同的 k + 1
位数。
输入格式
第一行包含三个整数 n
, m
, k
。
接下来 n
行,每行包含 m
个空格隔开的整数,表示给定矩阵
输出格式
输出一个整数,表示可以走出的不同 k+1
位数的个数
数据范围
对于 30%
的数据, 1 ≤ n
, m ≤ 2
, 0 ≤ k ≤ 2
对于 100%
的数据,1 ≤ n
, m ≤ 5
, 0 ≤ k ≤ 5
, m × n > 1
输入样例:
|
|
输出样例:
|
|
分析
- 遍历起点:矩阵中每个
(i, j)
坐标都可以作为起点,进行搜索 - 深度优先搜索进行数的构造:
- 递归地沿上下左右
4
个方向移动。 - 走
k
步后,将生成的k + 1
位数存入unordered_set
,去重后计算数量 - 递归参数包括当前位置
(x, y)
、已走步数u
、当前构造的数字cur
- 递归地沿上下左右
- 输出不同数的总个数
时间复杂度
每个格子最多 4^k
次递归调用,整体复杂度 O(nm * 4^k)
空间复杂度
空间复杂度为 O(1)
C++代码
|
|