面试题13. 机器人的运动范围

面试题13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

 

题解:

1.m行n列的方格

2.坐标从[0,0]到[m-1,n-1]

3.机器人从坐标 [0, 0] 的格子开始移动

4.每次可以向左、右、上、下移动一格

5.不能进入坐标和列坐标的数位之和大于k的格子

6.问能到达的格子有多少个

 

示例 1:

输入:m = 2, n = 3, k = 1

输出:3

示例 1:

输入:m = 3, n = 1, k = 0

输出:1

提示:

1 <= n,m <= 100

0 <= k <= 20

 

解题思路:

从题目知道,机器人走过的格子必须是连续的,这个隐含条件很重要,因为连续又是有界(不能进入坐标和列坐标的数位之和大于k的格子)的。因此考虑使用递归方法求解。这样只可以遍历下方向和右方向。

  • 编写countNum函数求解行列坐标的数位之和

  • 编写checkMove函数进行递归走方格,满足条件就把计数器加1

  • 另外为防止重复走方格,设置了一个辅助数组来帮助判断

C/C++题解(点击蓝字阅读源码,或前往公众号回复“13”获取)

class Solution {

public:

    int movingCount(int m, int n, int k) {

面试题13. 机器人的运动范围

Java题解(点击蓝字阅读源码,或前往公众号回复“13”获取)

class Solution {

    public int movingCount(int m, int n, int k) {

面试题13. 机器人的运动范围

Python题解(点击蓝字阅读源码,或前往公众号回复“13”获取)

class Solution(object):

    def movingCount(self, m, n, k):

        """:type m: int:type n: int:type k: int:rtype: int"""

面试题13. 机器人的运动范围

更多题解可前往公众号免费获取

面试题13. 机器人的运动范围