题目描述:
地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0, 0) 的格子开始移动,每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。
例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,38),因为 3+5+3+8=19。请问该机器人能够达到多少个格子?
解题思路:
回溯法。判断当前的格子是否满足坐标条件并且没有访问过,如果满足,计数加1,并在当前格子下继续判断上下左右四个格子是否满足条件。
def moving(m,n,i,j,threshold):
global vector
global sum
if i>=0 and i<m and j>=0 and j<n and getsum(i)+getsum(j)<threshold and vector[i*n+j]==0 :
sum +=1
vector[i*n+j]=1
moving(m,n,i-1,j,threshold)
moving(m,n,i+1,j,threshold)
moving(m,n,i,j-1,threshold)
moving(m,n,i,j+1,threshold)
return sum
def getsum(n):
sum = 0
while n>0:
sum=sum+n%10
n=n/10
return sum
m = 50
n = 50
threshold = 18
vector = [0 for index in range(m*n)]
sum = 0
num = moving(m,n,0,0,threshold)
print(num)