地上有一个 m 行 n 列的方格,从坐标 [00] 到坐标 [m-1n-1] 。一个机器人从坐标 [0 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。但它不能进入方格 [35 38],因为 3+5+3+8=19 。请问该机器人能够到达多少个格子?
如果我们将行坐标和列坐标数位之和大于 k 的格子看作障碍物,那么这道题就是一道很传统的搜索题目,我们可以使用广度优先搜索或者深度优先搜索来解决它。与 矩阵中的路径 类似,是典型的搜索 & 回溯问题。
但需要注意的是,本题不是要求找最长路径,而是可达坐标的累计数量。也就是说不需要将走过的路径恢复至未走过的状态,只需要统计走过的格子的累计数量最大值即可。
使用一个m * n大小的矩阵存储所有单元格的索引,记作 visited。借助这个访问记录矩阵,你就可以知道机器人已经走过了哪些格子,在这个过程中就可以统计走过的格子数量了。
同时这道题还有一个隐藏的优化:我们在搜索的过程中搜索方向可以缩减为向右和向下,而不必再向上和向左进行搜索。
矩阵中 满足数位和的解 构成的几何形状形如多个 等腰直角三角形 。
空间复杂度:最差情况下,visited 内存储矩阵所有单元格的索引,使用 O(MN) 的额外空间。
BFS 和 DFS 两者目标都是遍历整个矩阵,不同点在于搜索顺序不同。DFS 是朝一个方向走到底,再回退,以此类推;BFS 则是按照“平推”的方式向前搜索。