题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路:
同上一题思路一样,判断条件改成了行坐标和列坐标的数位之和大于k。
此外,这里我可以不再采用mark_matrix,而使用一个list进行坐标标记self.index_list.append([x, y])
。
参考答案:
# -*- coding:utf-8 -*-
class Solution:
def movingCount(self, threshold, rows, cols):
# write code here
if rows < 0 or cols <0:
return 0
self.count = 0
self.index_list = []
self.destGrid(threshold, 0, 0, rows, cols)
return self.count
def destGrid(self, threshold, row, col, rows, cols):
if row >= rows or col >= cols:
return
for x in range(row, rows):
for y in range(col, cols):
if self.index_sum(x, y) <= threshold and [x, y] not in self.index_list:
self.count += 1
self.index_list.append([x, y])
self.destGrid(threshold, x+1, y, rows, cols)
self.destGrid(threshold, x, y+1, rows, cols)
else:
return
def index_sum(self, row_index, col_index):
index_sum = 0
while row_index > 0:
index_sum += row_index % 10
row_index = int(row_index / 10)
while col_index > 0:
index_sum += col_index % 10
col_index = int(col_index / 10)
return index_sum
二刷答案:
class Solution:
def movingCount(self, threshold, rows, cols):
mark = [False] * (rows * cols)
res = self.helper(threshold, 0, 0, rows, cols, mark)
return res
def helper(self, threshold, row, col, rows, cols, mark):
if row < 0 or row >= rows or col < 0 or col >= cols or mark[row * cols + col] or self.get_count(row) + self.get_count(col) > threshold:
return 0
mark[row * cols + col] = True
return 1 + self.helper(threshold, row + 1, col, rows, cols, mark) + \
self.helper(threshold, row - 1, col, rows, cols, mark) + \
self.helper(threshold, row, col + 1, rows, cols, mark) + \
self.helper(threshold, row, col - 1, rows, cols, mark)
def get_count(self, num):
res = 0
while num:
res += num % 10
num /= 10
return res
Note
- 这种找路径尤其表明不能走回头路的题,往往需要结合一个标记矩阵用于标识该矩阵对应元素是否为已经遍历过了,如果变量过了,则不能再进行重复遍历。