力扣每日打卡8月20日打卡(529. 扫雷游戏,中等)dfs 未做出,已理解

使用深度优先搜索策略解决LeetCode上的529题扫雷游戏。通过模拟点击,处理边界条件和输入合法性,判断游戏状态。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法:深度优先搜索
思路:模拟点击,注意边界条件,输入是否合法,判断元素

class Solution:
    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
        # 如果board不存在元素,则直接返回
        if not board or not board[0]:
            return board

        rows, cols = len(board), len(board[0])
        # 如果没有在board里面,则返回
        if not ((0 <= click[0] < rows) and (0 <= click[1] < cols)):
            return board
        # 如果遇到 M 则返回 X
        if board[click[0]][click[1]] == 'M':
            board[click[0]][click[1]] = 'X'
            return board

        # 深度优先搜索        
        def dfs(i, j):
            # 边界条件
            if not (0 <= i < rows and 0 <= j < cols and board[i][j] == 'E'):
                return 
            direction = [(-1, -1),(-1, 0),(-1, 1),(0, -1),(0, 1),(1, -1),(1, 0),(1, 1)]
            bomb_num = 0
            for n in direction:
                # 易忘记,判断输入是否合法
                if 0 <= (n[0] + i) < rows and 0 <= (n[1] + j) < cols and board[n[0] + i][n[1] + j] == 'M':  
                    bomb_num += 1
            if bomb_num > 0:
                board[i][j] = str(bomb_num)
            else:
                board[i][j] = 'B'
                for m in direction:  # 一定写在else里面,不然if也会调用
                    dfs(m[0] + i, m[1] + j)
            return  # 要记得返回,不然会超出递归深度,程序不能结束
        dfs(click[0], click[1])
        return board

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值