题目描述
地上有一个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
网友评论