题目描述:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
解析:
跟“矩阵中寻找单词”一样,使用溯源法。
https://blog.csdn.net/u014513323/article/details/119009297
代码:
class Solution:
# def Judge(self, threshold, i, j):
# # 判断格子位数是否满足条件
# if sum(list(map(int, str(i) + str(j)))) <= threshold:
# return True
# else:
# return False
#
# def FindGrid(self, threshold, rows, cols, matrix, i, j):
# count = 0
# if i >= 0 and j >= 0 and i < rows and j < cols and self.Judge(threshold, i, j) and matrix[i][j] == 0:
# matrix[i][j] = 1
# count = 1 + self.FindGrid(threshold, rows, cols, matrix, i, j + 1) \
# + self.FindGrid(threshold, rows, cols, matrix, i, j - 1) \
# + self.FindGrid(threshold, rows, cols, matrix, i + 1, j) \
# + self.FindGrid(threshold, rows, cols, matrix, i - 1, j)
# return count
#
# def movingCount(self, threshold, rows, cols):
# matrix = [[0 for i in range(cols)] for j in range(rows)]
# count = self.FindGrid(threshold, rows, cols, matrix, 0, 0)
# return count
def movingCount(self, threshold, rows, cols):
if threshold < 0 or rows <= 0 or cols <= 0:
return 0
all_mat = [False] * (rows * cols)
return self.get_count(threshold , rows , cols , 0 , 0 , all_mat)
def get_count(self , k , row , col , now_x , now_y , allmat):
cnt = 0
if 0<= now_x < col and 0<= now_y < row and not allmat[now_y * col + now_x]:
allmat[now_y * col + now_x] = True
if self.judge(now_x) + self.judge(now_y) <= k:
cnt = 1 + self.get_count(k , row , col , now_x - 1 , now_y , allmat) \
+ self.get_count(k , row , col , now_x + 1 , now_y , allmat) \
+ self.get_count(k , row , col , now_x , now_y - 1 , allmat) \
+ self.get_count(k , row , col , now_x , now_y + 1 , allmat)
return cnt
def judge(self , x):
resume = 0
while x != 0:
resume += x % 10
x //= 10
return resume
k = 15
r = 20
l = 20
func = Solution()
x = func.movingCount(k , r , l )
print(x)
输出:359(测试案例为牛客网提交测试样例)