面试题13. 机器人的运动范围
地上有一个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
这个程序是很显然的图算法,BFS或者DFS都可以用,我们搜索每个点,如果该点不可到达,那么不用继续,否则继续搜索他们的临点。这里用DFS搜索,对每个点判断,如果点行列坐标和小于k,那么被认为能到达,在集合记录这个点坐标,最后搜索完毕时返回集合的长度,即有多少符合
这里用得是DFS,另外定义了一个函数判断行列坐标和
代码如下
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
if(k==0):
return 1
def count(a,b):
suma=0
sumb=0
while(a):
suma=a%10+suma
a=a//10
while(b):
sumb=b%10+sumb
b=b//10
return suma+sumb
visit=[[0 for i in range(n)]for i in range(m)]
q=[[0 for i in range(n)]for i in range(m)]
a=0
b=0
co=0
s=set()
def bfs(a,b):
jinzhi=0
if(a<0 or b<0 or a>=m or b>=n):
return
if(visit[a][b]==1):
return
visit[a][b]=1
if(count(a,b)<=k):
s.add((a,b))
bfs(a+1,b)
bfs(a,b+1)
else:
return
s=set()
bfs(a,b)
return len(s)
机器已经走完,列表还在旋转