让我们一起来玩扫雷游戏!

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

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

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

示例 1:

输入: [['E', 'E', 'E', 'E', 'E'],['E', 'E', 'M', 'E', 'E'],['E', 'E', 'E', 'E', 'E'],['E', 'E', 'E', 'E', 'E']]Click : [3,0]输出: [['B', '1', 'E', '1', 'B'],['B', '1', 'M', '1', 'B'],['B', '1', '1', '1', 'B'],['B', 'B', 'B', 'B', 'B']]解释:

示例 2:

输入: [['B', '1', 'E', '1', 'B'],['B', '1', 'M', '1', 'B'],['B', '1', '1', '1', 'B'],['B', 'B', 'B', 'B', 'B']]Click : [1,2]输出: [['B', '1', 'E', '1', 'B'],['B', '1', 'X', '1', 'B'],['B', '1', '1', '1', 'B'],['B', 'B', 'B', 'B', 'B']]解释:

注意:

  1. 输入矩阵的宽和高的范围为 [1,50]。
  2. 点击的位置只能是未被挖出的方块 ('M' 或者 'E'),这也意味着面板至少包含一个可点击的方块。
  3. 输入面板不会是游戏结束的状态(即有地雷已被挖出)。
  4. 简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。

DFS

类似于迷宫问题,首先想到深度优先搜索。

  1. 当前点击的是「未挖出的地雷」,我们将其值改为 X\text{X}X 即可。
  2. 当前点击的是「未挖出的空方块」,我们需要统计它周围相邻的方块里地雷的数量 cnt\textit{cnt}cnt(即 M\text{M}M 的数量)。如果 cnt\textit{cnt}cnt 为零,即执行规则 222,此时需要将其改为 B\text{B}B,且递归地处理周围的八个未挖出的方块,递归终止条件即为规则 444,没有更多方块可被揭露的时候。否则执行规则 333,将其修改为数字即可。

Code

 def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:dirs = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]def dfs(x, y):cnt = 0for dx, dy in dirs:nx, ny = x + dx, y + dyif not (nx < 0 or ny < 0 or nx >= len(board) or ny >= len(board[0])):cnt += board[nx][ny] == 'M'if cnt > 0:board[x][y] = str(cnt)else:board[x][y] = 'B'for dx, dy in dirs:nx, ny = x + dx, y + dyif not (nx < 0 or ny < 0 or nx >= len(board) or ny >= len(board[0]) or board[nx][ny] != 'E'):dfs(nx, ny)if board[click[0]][click[1]] == 'M':board[click[0]][click[1]] = 'X'else:dfs(click[0], click[1])return board

复杂度分析

  • 时间复杂度:O(nm)O(nm)O(nm),其中 nnn 和 mmm 分别代表面板的宽和高。最坏情况下会遍历整个面板。
  • 空间复杂度:O(nm)O(nm)O(nm)。空间复杂度取决于递归的栈深度,而递归栈深度在最坏情况下有可能遍历整个面板而达到 O(nm)O(nm)O(nm)。

529. Minesweeper相关推荐

  1. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  2. 【Breadth-first Search 】专题3

    529 Minesweeper 输入:一个二维矩阵,一些修改规则. 如果点到一个隐藏的地雷M,把它改为X,游戏结束 如果点到一个E,且其周围8邻接的范围没有地雷,那么应该把8邻接的范围的格子全部翻开为 ...

  3. Depth-first Search深度优先搜索专题1

    104. Maximum Depth of Binary Tree 思路:顺着树的一个分支一直数层数直到叶子节点.DFS的思路.这个题目可以练习的是递归转迭代. 代码 695. Max Area of ...

  4. 接雨水12 · Trapping Rain Water12

    [抄题]: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...

  5. LeetCode github集合,附CMU大神整理笔记

    Github LeetCode集合 本人所有做过的题目都写在一个java项目中,同步到github中了,算是见证自己的进步.github目前同步的题目是2020-09-17日之后写的题.之前写过的题会 ...

  6. Leetcode算法题-解法转载

    版权声明:本文为博主原创文章,未经博主允许不得转载.    https://blog.csdn.net/fuxuemingzhu/article/details/85112591 作者: 负雪明烛 i ...

  7. LeetCode All in One 题目讲解汇总(持续更新中...)

    原文地址:https://www.cnblogs.com/grandyang/p/4606334.html 终于将LeetCode的大部分题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开 ...

  8. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  9. LeetCode 力扣 529. 扫雷游戏 minesweeper DFS

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 529. 扫雷游戏 题目描述 ...

最新文章

  1. 数据蒋堂 | “后半”有序的分组
  2. 计算机课上机课安排表,周—一学期(南山校区)计算机优秀教学上机课程表.doc
  3. python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),
  4. Silverlight使用webClient上传下载
  5. 服务器建网站www无法访问,IIS6服务器搭建网站无法访问解决方案总结_DOIT.com.cn...
  6. ELK 日志处理开发指南
  7. 华为诺亚CV方向19篇论文入选ICCV 2019
  8. 获取论坛cookie_注意:这是你成为Cookie时尚社区OG的最后机会!
  9. python编程语言-Python有望超越Java排第二?风变编程解析编程语言新趋势
  10. 【Android 界面效果43】Android LayoutInflater的inflate方法中attachToRoot的作用
  11. 如何在ArcGIS中由县级数据生成省级数据?
  12. java 微信 百度地图,android 百度地图gps转百度地图坐标java.lang.UnsatisfiedLinkError: CoordinateEncryptEx...
  13. URP管线理解(一)宏观入口
  14. 如何查看台式机计算机网络密码,如何在电脑上查找当前的WiFi网络密码
  15. Spring Cloud入门-Oauth2授权之JWT集成(Hoxton版本)
  16. 学计算机的制作水印,如何给自己的图片制作水印
  17. python实现docx的批注(comments)插入
  18. 计算机课程可信计算,可信计算-表7.计算机学院(系、所)研究生课程简介.doc...
  19. 雅思听力数字日期归纳总结
  20. Leetcode 1235. Maximum Profit in Job Scheduling (python)

热门文章

  1. [WPF]使用Fody提高效率
  2. Vue状态管理vuex
  3. WPF 使用MahApps.Metro UI库
  4. 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
  5. HDU 3790 最短路径问题
  6. jQuery EasyUI dialog 居中最简单的办法
  7. day17-jdbc 6.Connection介绍
  8. 簡單SQL存儲過程實例
  9. mysql union group by_Mysql UNION和GROUP BY
  10. tcl是华为鸿蒙受益者吗,在三星华为都很成功的杨柘 为什么却栽在了TCL?