方法一:深度优先遍历 DFS
深度优先搜索: 可以理解为暴力法模拟机器人在矩阵中的所有路径。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
剪枝: 在搜索中,遇到数位和超出目标值、此元素已访问,则应立即返回,称之为 可行性剪枝 。
算法解析:
递归参数: 当前元素在矩阵中的行列索引 i 和 j ,两者的数位和 si, sj 。
终止条件: 当 ① 行列索引越界 或 ② 数位和超出目标值 k 或 ③ 当前元素已访问过 时,返回 00 ,代表不计入可达解。
递推工作:
标记当前单元格 :将索引 (i, j) 存入 Set visited 中,代表此单元格已被访问过。
搜索下一单元格: 计算当前元素的 下、右 两个方向元素的数位和,并开启下层递归 。
回溯返回值: 返回 1 + 右方搜索的可达解总数 + 下方搜索的可达解总数,代表从本单元格递归搜索的可达解总数。

class Solution:def movingCount(self, m: int, n: int, k: int) -> int:def dfs(i, j, si, sj):if i >= m or j >= n or k < si + sj or (i, j) in visited: return 0visited.add((i,j))return 1 + dfs(i + 1, j, si + 1 if (i + 1) % 10 else si - 8, sj) + dfs(i, j + 1, si, sj + 1 if (j + 1) % 10 else sj - 8)visited = set()return dfs(0, 0, 0, 0)
class Solution:def movingCount(self, m:int, k:int) -> int:def dfs(i,j,si,sj):if i>= m or j >= n or k<si+sj or (i,j) in visited: return 0visited.add((i,j))return 1+dfs(i+1, j, si+1 if (i+1)%10 else si-8, sj) +dfs(i,
def digitsum(n):ans = 0while n:ans += n % 10n //= 10return ansclass Solution:def movingCount(self, m: int, n: int, k: int) -> int:from queue import Queueq = Queue()q.put((0, 0))s = set()while not q.empty():x, y = q.get()if (x, y) not in s and 0 <= x < m and 0 <= y < n and digitsum(x) + digitsum(y) <= k:s.add((x, y))for nx, ny in [(x + 1, y), (x, y + 1)]:q.put((nx, ny))return len(s)
def digitsum(n):ans =0while n:ans += n%10n //=10return ans
class Solution:def movingCount(self,m: int, n:int,k:int) -> int:from queue import Queueq = Queue()q.put((0,0))s = set()while not q.empty():x,y = q.set()if (x,y) not in s and 0<=x<m and 0<=y<n and digitsum(x) +digitsum(y)<=k:s.add((x,y))for nx, ny in [(x+1,y),(x,y+1)]:q.put((nx,ny))return len(s)
def digitsum(n):ans = 0while n:ans += n%10n//=10return ans
class Solution:def movingCount(self, m: int,n:int,k:int) ->int:from queue import Queueq = Queue()q.put((0,0))s = set()while not q.empty():x,y =q.get()if (x,y) not in s and 0<=x<m and 0 <=y<n and digitsum(x) +digitsum(y) <=k:s.add((x,y))for nx, ny in [(x+1,y),(x,y+1)]:q.put((nx,ny))return len(s)
def digitsum(n):ans = 0while n:ans +=n%10n //=10return ans
class Solution:def movingCount(self,m: int, n:int,k:int) -> int:from queue import Queueq = Queue()q.put((0,0))s.put((0,0))s = set()while not q.empty():x,y = q.get() <if (x,y) not in s and 0<=x<m and 0<=y<n and digitsum(x) +digitsum(y) <= k:s.add((x,y))for nx, ny in [(x+1,y),(x,y+1)]:q.put((nx,ny))return len(s)
def digitsum(n):ans =0while n:ans += n%10n //= 10return ans
class Solution:def movingCount(self, m: int, n:int, k:int) -> int:from queue import Queueq= Queue()q.put((0,0))s = set()while not q.empty():x, y = q.get()if (x,y) not in s and 0<=x<m and 0<=y<n and digitsum(x) + digitsum(y) < =y:s.add((x,y))for nx, ny in [(x+1, y),(x,y+1)]:q.put((nx, ny))return len(s)

2021-08-25剑指 Offer 13. 机器人的运动范围相关推荐

  1. 【LeetCode】剑指 Offer 13. 机器人的运动范围

    [LeetCode]剑指 Offer 13. 机器人的运动范围 文章目录 [LeetCode]剑指 Offer 13. 机器人的运动范围 package offer;public class Solu ...

  2. 剑指 Offer 13. 机器人的运动范围

    剑指 Offer 13. 机器人的运动范围 题目 ​ 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上 ...

  3. LeetCode 剑指Offer 13 机器人的运动范围

    LeetCode 剑指Offer 13 机器人的运动范围 题目 解题 解题一:深度优先搜索 解题二:广度优先搜索 解题三:动态规划 题目 解题 深度优先和广度优先解题思路参考: 剑指 Offer 13 ...

  4. [[EVD]] - 剑指 Offer 13. 机器人的运动范围

    题目分析:[[EVD]] - 剑指 Offer 13. 机器人的运动范围https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-l ...

  5. 【四重优化,速看】剑指 Offer 13. 机器人的运动范围

    立志用最少的代码做最高效的表达 题目 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不 ...

  6. Leetcode 剑指 Offer 13. 机器人的运动范围 (每日一题 20210906)

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动到方格外),也不能进入行坐标和列 ...

  7. 剑指 Offer 13. 机器人的运动范围 【重刷】

    文章目录 1.概述 2. 代码 1.概述 题目:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/ 地上有一个m行 ...

  8. Leetcode刷题笔记——剑指 Offer 13. 机器人的运动范围(中等)

    文章目录 题目描述 解题思路 方法一:深度优先遍历DFS 复杂度分析 C++代码实现 方法二:广度优先遍历BFS 复杂度分析 C++代码实现 参考连接 题目描述 地上有一个m行n列的方格,从坐标 [0 ...

  9. 35. (★DFS)剑指 Offer 13. 机器人的运动范围

    题目描述: 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动到方格外),也不能进 ...

  10. 剑指 Offer 13. 机器人的运动范围解题思路

    文章目录 题目 解题思路 题目 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动 ...

最新文章

  1. 数据库系统概论:第九章 关系查询和关系优化
  2. win7下的nginx小demo
  3. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
  4. 上线了!游戏企业防沉迷落实情况有了举报平台
  5. 查询oracle表空间有什么数据,oracle查询表空间使用情况与查询有哪些数据库实例在运行...
  6. 7-1 宿舍谁最高? (20 分)
  7. 众说纷“云”之云安全企业用户追踪寻访
  8. Mac版Python3安装/升级
  9. linux新增字符串,字符串添加字符_Linux使用sed命令添加字符串的方法
  10. springboot实现支付宝支付功能
  11. php学习笔记——PHP 概述
  12. 自己动手编写CSDN博客备份工具-blogspider源码下载(4)
  13. c++:从单例到内存屏障
  14. 将mac打造成和linux差不多的c语言开发环境,完全新手版
  15. 中产移民:很难找到好工作。
  16. 【李佳辉_周报_2022.10.23】
  17. 解决Win10频繁禁用IME的问题
  18. C:\Users\Fan\.eclipse\...\configuration could not be created. Please choose a writable locati
  19. SCA(Service Component Architecture)编程模型入门
  20. 解决UITableView xib添加到Storyboard出现IB Designables错误

热门文章

  1. 1024程序员 | 我如何从零基础转行成为一个自信的前端
  2. 数据库优化案例——————某知名零售企业ERP系统
  3. NLP入门之N元语法模型
  4. RHEL6.3基本网络配置(4) 其它常用网络配置文件
  5. CentOS安装并设置MariaDB
  6. shell 后台运行程序并写pid文件
  7. wordpress如何获得当前用户的头像
  8. 百元百鸡 //构造结构体变量
  9. linux qt遍历设备,Qt获取设备环境变量
  10. C程序设计--结构体+单向链表