暑假leetcode每日一题打卡-第十六天-剑指 Offer 13. 机器人的运动范围(middle)

前言

通过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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值