地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
示例 1:
输入:m = 2, n = 3, k = 1
输出:3
示例 2:
输入:m = 3, n = 1, k = 0
输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
# m行,n列,k为限定值
# 存储已访问过的元素
access_set = set()
# 从左上角开始搜索
i = 0
j = 0
# 能够达到格子的个数
access_num = 0
return self.dfs(m, n, i, j, k, access_set, access_num)
# m:行数
# n:列数
# i:访问的行坐标
# j:访问的列坐标
# k:限定值
# access_set:存储访问过元素索引的集合
# access_num:可以访问的数量
def dfs(self, m, n, i, j, k, access_set, access_num):
# 如果访问的索引越界,则返回0
if( i >= m or j >= n ):
return 0
# 如果元素已经被访问过,则返回0
str_index = str(i) + ',' + str(j)
if ( str_index in access_set):
return 0
# 满足要求则计算+1
# print(str_index, self.get_sum(i, j), k)
access_set.add(str_index)
if self.get_sum(i, j) <= k:
access_num += 1
# print(1111, access_num)
# 向下搜索
i1 = i + 1
access_num += self.dfs(m, n, i1, j, k, access_set, 0)
# 向右搜索
j1 = j + 1
access_num += self.dfs(m, n, i, j1, k, access_set, 0)
return access_num
else:
access_set.remove(str_index)
return 0
# i:行索引
# j:列索引
# 获取索引值的和
def get_sum(self, i, j):
sum_index = 0
while( i != 0 ):
sum_index += i % 10
i = i // 10
while( j != 0):
sum_index += j % 10
j = j // 10
return sum_index