前言
通过leetcode记录自己每天坚持刷题,以此监督自己的学习。不能放假了就懈怠😁
题目简介
题目传送地:剑指 Offer 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
题目解析
这个题没啥说的,中规中矩的bfs基础题,稍微学过一点的都没什么问题
不过我刚开始脑子瓦特了用dfs做,后面又写了一个bfs版本,dfs真慢
代码
DFS版
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
def getsum(m): //获取数字每位相加和
sum_=0
for i in (str(m)):
sum_+=int(i)
return sum_
dic={} //存放走过的状态,避免重复
def dfs(left,top,m,n,k):
if (getsum(left)+getsum(top))>k or top>=m or left>=n:
return
if (top,left) in dic:
return
dic[(top,left)]=True
global ans
ans+=1
for x,y in [[1,0],[0,1]]:
dfs(left+x,top+y,m,n,k) //Dfs
global ans
ans=0
dfs(0,0,m,n,k)
return ans
BFS版
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
def getsum(m):
sum_=0
for i in (str(m)):
sum_+=int(i)
return sum_
q=deque([(0,0)])
dic={(0,0):True} #有可能0,0无法被扫描到,事先放入
ans=1 # 事先放0,0算进去
while q: # BFS
a,b=q.popleft()
for x,y in [[1,0],[0,1],[-1,0],[0,-1]]:
i,j=a+x,b+y
if (i,j) not in dic and 0<=i<m and 0<=j<n and (getsum(i)+getsum(j))<=k:
ans+=1
dic[(i,j)]=True
q.append((i,j))
return ans