【leetcode刷题笔记】529.扫雷游戏

1. 问题

Leetcode原题地址

给定一个代表游戏板的二维字符矩阵。 ‘M’ 代表一个未挖出的地雷,‘E’ 代表一个未挖出的空方块,‘B’ 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字(‘1’ 到 ‘8’)表示有多少地雷与这块已挖出的方块相邻,‘X’ 则表示一个已挖出的地雷。

现在给出在所有未挖出的方块中(‘M’或者’E’)的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:

  1. 如果一个地雷(‘M’)被挖出,游戏就结束了- 把它改为 ‘X’。
  2. 如果一个没有相邻地雷的空方块(‘E’)被挖出,修改它为(‘B’),并且所有和其相邻的未挖出方块都应该被递归地揭露。
  3. 如果一个至少与一个地雷相邻的空方块(‘E’)被挖出,修改它为数字(‘1’到’8’),表示相邻地雷的数量。
  4. 如果在此次点击中,若无更多方块可被揭露,则返回面板。

示例:

字符串图解
在这里插入图片描述在这里插入图片描述

2. 思路

  • 如果点击位置为M:修改为X,返回
  • 如果点击位置为E:递归查询, 往上下左右四个斜角,共8个方向开始搜索。
    1. 如果含有M,,修改当前位置的值,并且不再递归查询
    2. 如果没有M,当前位置改为B,并且递归查询剩余其他E位置(不需要查询非E位置)

按照这个思路,就能比较清晰地写出来了……

class Solution:
    def updateBoard(self, board, click):
        m, n = len(board), len(board[0])
        i, j = click
        if board[i][j] == 'M':
            board[i][j] = 'X'
            return board
        else:
            m_num = 0
            neibor = [(i - 1, j - 1), (i - 1, j), (i - 1, j + 1), (i, j - 1),
                      (i, j + 1), (i + 1, j - 1), (i + 1, j), (i + 1, j + 1)]
            for k1, k2 in neibor:
                if 0 <= k1 < m and 0 <= k2 < n and board[k1][k2] == 'M':
                    m_num += 1

            if m_num == 0:
                board[i][j] = 'B'
                for k1, k2 in neibor:
                    if 0 <= k1 < m and 0 <= k2 < n and board[k1][k2] == 'E':
                        self.updateBoard(board, [k1, k2])
            else:
                board[i][j] = str(m_num)

        return board

3. 总结

作者太懒了,没什么要总结的……
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值