大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


文章目录

  • 529. 扫雷游戏
    • 题目描述
    • 样例
      • 示例 1:
      • 示例 2:
    • 分析
    • 代码
    • 提交结果

529. 扫雷游戏

题目描述

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

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

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

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

样例

示例 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. 简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。

分析

由于题目要求你根据规则来展示执行一次点击操作后游戏面板的变化,所以我们只要明确该扫雷游戏的规则,并用代码模拟出来即可。

那我们着眼于题目的规则,会发现总共分两种情况:

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

    • 否则执行规则 3,将其修改为数字即可。

    • 整体看来,一次点击过程会从一个位置出发,逐渐向外圈扩散,所以这引导我们利用「搜索」的方式来实现。这里以深度优先搜索为例:我们定义递归函数 dfs(x, y) 表示当前在 (x,y)点,执行扫雷规则的情况,我们只要按照上面理出来的情况来进行模拟即可,在cnt 为零的时候,对当前点相邻的未挖出的方块调用递归函数,否则将其改为数字,结束递归。

代码

class Solution {//定义8个方向static int[] dx = {-1, -1, -1, 0, 1, 1, 1, 0};static int[] dy = {-1, 0, 1, 1, 1, 0, -1, -1};public char[][] updateBoard(char[][] board, int[] click) {int x = click[0], y = click[1];//(1)挖出地雷if (board[x][y] == 'M') {board[x][y] = 'X';return board;}//(2)判断当前点开得节点8个方向是否有雷,统计个数board[x][y] = 'B';int cnt = 0;for (int i = 0; i < 8; i++) {int newX = x + dx[i];int newY = y + dy[i];if (newX >= 0 && newX < board.length && newY >= 0 && newY < board[0].length && board[newX][newY] == 'M')cnt++;}if (cnt != 0) {board[x][y] = (char) (cnt + '0');return board;}//(3)递归搜索8个方向相邻的节点for (int i = 0; i < 8; i++) {int newX = x + dx[i];int newY = y + dy[i];if (newX >= 0 && newX < board.length && newY >= 0 && newY < board[0].length&&board[newX][newY]=='E')updateBoard(board, new int[]{newX, newY});}return board;}
}

提交结果


2020年8月20日更

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


LeetCode 力扣 529. 扫雷游戏 minesweeper DFS相关推荐

  1. 力扣529.扫雷游戏

    题目条件: 1.如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'. 2.如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的未挖出方块都应该被递归地揭露. ...

  2. leetcode: 529. 扫雷游戏

    529. 扫雷游戏 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/number-of-islands/ 让我们一起来玩扫雷游戏! 给你一个大小为 m ...

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

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

  4. 《LeetCode力扣练习》第55题 跳跃游戏 Java

    <LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...

  5. 【手把手带你刷Leetcode力扣】10.数据结构 -图

    图: 顶点 邻居节点 边 度:边的数量 无向图 有向图 入度:指向该顶点的边的数量 出度:以该顶点为起点指向别的顶点的边的数量 权重图 最短路径 贝尔曼-福特算法(Bellman-Ford) 迪克斯特 ...

  6. LeetCode55跳跃游戏//力扣55跳跃游戏(贪心)

    LeetCode55跳跃游戏//力扣55跳跃游戏(贪心) 来源:力扣(LeetCode) 链接:题目跳转 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该 ...

  7. 手把手带你刷Leetcode力扣 学习总结

    文章目录 1. 总体规划 2. 算法复杂度 2.1 时间复杂度 2.2 空间复杂度 3. 数据结构 3.1 数组[Array] 3.1.1 Python常用操作 3.1.2 Java常用操作 3.1. ...

  8. 《LeetCode力扣练习》剑指 Offer 30. 包含min函数的栈 Java

    <LeetCode力扣练习>剑指 Offer 30. 包含min函数的栈 Java 一.资源 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调 ...

  9. 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java

    <LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...

最新文章

  1. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]
  2. 总结 贪心算法_这几道经典例题帮你轻松搞透贪心算法
  3. Cissp-【第4章 通信与网络安全】-2021-3-12(408页-445页)
  4. 写给师弟师妹的一封信-论在校程序员的学习方向
  5. 设计模式--适配器(Adapter)模式
  6. python selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)
  7. python之setdefault()和defaultdict()处理缺失值的键
  8. NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
  9. GoogLeNet结构
  10. Install and Use SourceMonitor in Windows7
  11. 陪集编码(Coset coding)
  12. 刷机“变砖”,黑屏,自己通过以下方法再次让手机死而复生
  13. 清明节 java_清明节习俗
  14. 关于复制粘贴快捷键失效问题的解决方法
  15. 【08月13日】预分红股息率最高排名
  16. C Primer Plus(第五版)2
  17. 新玺配资:股票市场中的配股是什么意思
  18. 计算机应用模块等级考试大纲,计算机等级考试大纲最新.doc
  19. c语言按姓名查询出入信息,请问c语言如何实现按姓名查找?
  20. 如何使用 Director 编写“拼图游戏”

热门文章

  1. 分布式存储ceph——(4)ceph 添加/删除osd
  2. 苹果mac系统删除._文件
  3. 信号测试软件看到服务小区,5G(NR)网络中终端对服务小区和邻小区测量
  4. php拓展 包管理工具
  5. ADI Blackfin DSP处理器-BF533的开发详解52:图像处理专题-CMOS摄像头采集图像(含源码)
  6. 机器学习实践系列之11 - OpenCV实战车道线检测
  7. MySQL/数据库 知识点总结
  8. 重点总结->浏览器面试灵魂50问(一)
  9. 如何自定义IDM的下载提示音
  10. html九图拼图游戏代码,基于Vue.js实现数字拼图游戏