剑指Offer 66. 机器人的运动范围 (回溯)

Posted on 2018-10-18 11:08  _hqc  阅读(149)  评论(0编辑  收藏  举报

题目描述

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

题目地址

https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8?tpId=13&tqId=11219&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

和上一道题十分相似,只不过这次的限制条件变成了坐标位数之和。对于求坐标位数之和,我们单独用一个函数实现,然后套入上一道题的代码中即可。

Python

# -*- coding:utf-8 -*-
class Solution:
    def movingCount(self, threshold, rows, cols):
        # write code here
        if rows < 1 or cols < 1:
            return False
        visited = [False] * int(rows*cols)
        count = self.movingCountCore(threshold, rows, cols, 0, 0, visited)
        return count

    def movingCountCore(self, threshold, rows, cols, row, col, visited):
        count = 0
        if 0 <= row < rows and 0 <= col < cols and self.getDigitSum(row)+self.getDigitSum(col)<=threshold and not visited[row*cols+col]:
            visited[row * cols + col] = True
            count = 1+ self.movingCountCore(threshold, rows, cols, row+1, col, visited) + \
                         self.movingCountCore(threshold, rows, cols, row-1, col, visited) + \
                         self.movingCountCore(threshold, rows, cols, row, col+1, visited) + \
                         self.movingCountCore(threshold, rows, cols, row, col-1, visited)
        return count
    def getDigitSum(self,num):
        sum = 0
        while num:
            sum += num%10
            num /= 10
        return sum

if __name__ == '__main__':
    result = Solution().movingCount(18,3,4)
    print(result)