leetcode 999.车的可用捕获量 python DFS

leetcode 999.

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题解

思路:理解题目,找到R在哪以后,R只能往上下左右走,走几格都行,但是只要走了方向就不能改变了,因为题目要求的是在一次移动中捕获到的车的数量。

所以其实就是一棵树,根节点是R,上下左右为4条树枝,每条树枝也只有一条分叉,因为确定移动方向后就不能变了。

根据这个树,就想到了 DFS。
DFS一般都是作为一个子函数调用的。

结合代码看:因为题目要返回的结果只是要求计数,没有要求返回路径,所以dfs子函数就不需要添加全局变量来保存每一次的结果。

上代码

class Solution:
    def numRookCaptures(self, board):
        def findR(board): # 遍历找到 R 的位置
            for i in range(len(board)):
                for j in range(len(board[0])):
                    if board[i][j] == 'R':
                        return [i,j]
            return None
        
        def dfs(i,j,board,w,q): # 深度优先遍历
            i += w # 前进一步
            j += q
            while -1<i<len(board) and -1<j<len(board[0]): # 设置不要超出棋盘范围,可以直接写8
                if board[i][j] == 'B': # 遇到 象,就不能继续往前走了,所以这条路不行
                    return 0
                elif board[i][j] == 'p': # 遇到 车,吃掉,返回1,表示吃到一个🚗
                    return 1
                else: # 遇到空格,继续往前一步
                    i += w
                    j += q
            return 0 # 走到了棋盘尽头,啥也没遇到,返回0

        res = 0
        [i,j] = findR(board) # i和j 就是R的位置
        for w,q in [[0,1],[0,-1],[1,0],[-1,0]]: # 有 上下左右 4个方向可以走
            res += dfs(i,j,board,w,q) # 分4个方向 分别调用dfs

        return res

总结:DFS和BFS一直是我的不太会的点,每次遇到都觉得很难,脑袋一团浆糊,但是总要迎难而上的嘛,慢慢多练也就会了。之前写了一题 leetcode 22.括号生成,也是用到了DFS,之后也会记录到博客里。经过这两题,已经对DFS没这么抗拒了,💪!

DFS总是作为一个子函数来调用。
如果要求记录下路径的话,总是用一个全局变量来记录。这个变量也作为参数输入到DFS函数中,这样就可以不断传递到下一级中,记录下每一级节点的结果,最后连成路径。(参考leetcode 22.括号生成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于LeetCode上的问题994.腐烂的橘子,你可以使用Python来解决。下面是一个示例代码: ```python from collections import deque def orangesRotting(grid): # 记录网格的行数和列数 row, col = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存腐烂的橘子的位置 queue = deque() # 记录新鲜橘子的数量 fresh_count = 0 # 遍历整个网格,初始化队列和新鲜橘子的数量 for i in range(row): for j in range(col): if grid[i][j] == 2: # 腐烂的橘子 queue.append((i, j)) elif grid[i][j] == 1: # 新鲜橘子 fresh_count += 1 # 如果新鲜橘子的数量为0,直接返回0 if fresh_count == 0: return 0 # 初始化分钟数 minutes = 0 # 开始进行BFS,直到队列为空 while queue: # 记录当前分钟数下,队列中的元素数量 size = len(queue) # 遍历当前分钟数下的所有腐烂的橘子 for _ in range(size): x, y = queue.popleft() # 遍历四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断新位置是否在网格内,并且是新鲜橘子 if 0 <= nx < row and 0 <= ny < col and grid[nx][ny] == 1: # 将新鲜橘子变为腐烂状态 grid[nx][ny] = 2 # 将新鲜橘子的位置加入队列 queue.append((nx, ny)) # 新鲜橘子的数量减1 fresh_count -= 1 # 如果当前分钟数下,没有新鲜橘子了,结束循环 if fresh_count == 0: break # 每遍历完一层,分钟数加1 minutes += 1 # 如果最后还有新鲜橘子,返回-1,否则返回分钟数 return -1 if fresh_count > 0 else minutes ``` 你可以将给定的网格作为参数传递给`orangesRotting`函数来测试它。请注意,该代码使用了BFS算法来遍历橘子,并计算腐烂的分钟数。希望能对你有所帮助!如果有任何疑问,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值