美文网首页
机器人的运动范围

机器人的运动范围

作者: Max_7 | 来源:发表于2018-10-03 16:50 被阅读0次

    题目描述

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

    思路

    整体思路就是从(0,0)点开始,向4个方向进行搜索,得出四个方向的运动范围步数,求和得到最后结果。 对于每到达一个方格,要判断是否可以进入这个方格。 对于数位和,可以再另写一个方法,用来每次的计算。整体而言,还是回溯法进行递归搜索。

    代码

    class Solution:
         def movingCount(self, threshold, rows, cols):
            # 特殊情况判断
            if threshold < 0 or rows <= 0 or cols <= 0:
                return 0
            visited = [[False for i in range(cols)] for j in range(rows)]  # 防止重复进入
            count = self.botmove(threshold, rows, cols, 0, 0, visited)
            return count
         def botmove(self, k, rows, cols, row_index, col_index, visited):
            count = 0 #记录范围
            if self.goodMove(k, rows, cols, row_index, col_index, visited):
                visited[row_index][col_index] = True
                count = 1 + self.botmove(k, rows, cols, row_index + 1, col_index, visited) \
                        + self.botmove(k, rows, cols, row_index - 1, col_index, visited) \
                        + self.botmove(k, rows, cols, row_index, col_index + 1, visited) \
                        + self.botmove(k, rows, cols, row_index, col_index - 1, visited)
                #当前方向再加上四个可移动方向的和
            return count
         def goodMove(self, k, rows, cols, row_index, col_index, visited):
            #判断是否可以移动到当前位置,判断数位和,行列边界,是否访问过
            rowSum = self.digitSum(row_index)
            colSum = self.digitSum(col_index)
            numSum = rowSum + colSum
            #flag = visited[row_index][col_index]
            if row_index >= 0 and row_index < rows and col_index >= 0 and col_index < cols and numSum <= k and visited[row_index][col_index] is False:
                return True
            return False
         def digitSum(self, number):
            ans = 0
            while number > 0:
                ans = ans + number % 10
                number = int(number / 10)
            return ans
    

    相关文章

      网友评论

          本文标题:机器人的运动范围

          本文链接:https://www.haomeiwen.com/subject/ljpzoftx.html