Leetcode刷题详解——扫雷游戏

1. 题目链接:529. 扫雷游戏

2. 题目描述:

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

给你一个大小为 m x n 二维字符矩阵 board ,表示扫雷游戏的盘面,其中:

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

给你一个整数数组 click ,其中 click = [clickr, clickc] 表示在所有 未挖出的 方块('M' 或者 'E')中的下一个点击位置(clickr 是行下标,clickc 是列下标)。

根据以下规则,返回相应位置被点击后对应的盘面:

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

示例 1:

img

输入:board = [["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:

img

输入:board = [["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"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 50
  • board[i][j]'M''E''B' 或数字 '1''8' 中的一个
  • click.length == 2
  • 0 <= clickr < m
  • 0 <= clickc < n
  • board[clickr][clickc]'M''E'

3. 解法:

模拟类型的dfs题目,首先要搞懂题目的要求,也就是游戏规则,从题目所给的点击位置开始,根据游戏规则,来一次dfs即可。

  1. 首先,定义了两个数组dxdy,分别表示八个方向的横坐标偏移量和纵坐标偏移量。
  2. 然后,在updateBoard函数中,获取了棋盘的行数m和列数n,以及点击位置的坐标(x, y)
  3. 如果点击位置是地雷(即board[x][y] == 'M'),则将该位置标记为已点击(即board[x][y] = 'X'),并返回更新后的棋盘。
  4. 如果点击位置不是地雷,则调用dfs函数进行深度优先搜索。
  5. dfs函数的作用是计算一个位置周围的地雷数量,并将该位置标记为相应的数字或字符。具体步骤如下:
    • 初始化周围地雷的数量为0。
    • 遍历八个方向,计算相邻位置的坐标,并判断是否在棋盘范围内且为地雷。如果是,则地雷数量加1。
    • 如果周围有地雷,则将当前位置标记为周围地雷的数量,并返回。
    • 如果周围没有地雷,则将当前位置标记为未点击(即board[i][j] = 'B')。
    • 再次遍历八个方向,计算相邻位置的坐标,并判断是否在棋盘范围内且为未点击的空位。如果是,则对相邻位置进行深度优先搜索。
  6. 最后,返回更新后的棋盘。

请添加图片描述

class Solution {
    int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1}; // 定义八个方向的横坐标偏移量
    int dy[8] = {1, -1, 0, 0, 1, -1, 1, -1}; // 定义八个方向的纵坐标偏移量
    int m, n; // 定义棋盘的行数和列数

public:
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        m = board.size(), n = board[0].size(); // 获取棋盘的行数和列数
        int x = click[0], y = click[1]; // 获取点击位置的坐标
        if (board[x][y] == 'M') // 如果点击位置是地雷
        {
            board[x][y] = 'X'; // 将地雷标记为已点击
            return board; // 返回更新后的棋盘
        }
        dfs(board, x, y); // 否则,进行深度优先搜索
        return board; // 返回更新后的棋盘
    }

    void dfs(vector<vector<char>>& board, int i, int j) // 深度优先搜索函数
    {
        int count = 0; // 初始化周围地雷的数量为0
        for (int k = 0; k < 8; k++) // 遍历八个方向
        {
            int x = i + dx[k], y = j + dy[k]; // 计算相邻位置的坐标
            if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M') // 如果相邻位置是地雷
            {
                count++; // 地雷数量加1
            }
        }
        if (count) // 如果周围有地雷
        {
            board[i][j] = count + '0'; // 将当前位置标记为周围地雷的数量
            return; // 返回
        }
        else // 如果周围没有地雷
        {
            board[i][j] = 'B'; // 将当前位置标记为未点击
            for (int k = 0; k < 8; k++) // 遍历八个方向
            {
                int x = i + dx[k], y = j + dy[k]; // 计算相邻位置的坐标
                if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E') // 如果相邻位置是未点击的空位
                {
                    dfs(board, x, y); // 对相邻位置进行深度优先搜索
                }
            }
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/154367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【53.最大子数组和】

一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums.size());dp[0]nums[0];int retdp[0];for(int i1;i<nums.size();i){dp[i]max(dp[i-1]nums[i],nums[i]);retmax(dp[i],ret);}ret…

Linux输入设备应用编程(键盘,触摸屏,按键,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

ERP管理系统:企业升级的秘密武器

ERP管理系统&#xff1a;企业升级的秘密武器 在当今快速发展的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断进行自我升级。而在这个过程中&#xff0c;ERP管理系统以其强大的功能和优化流程的能力&#xff0c;逐渐成为了企业升级的秘密武器。 一、ERP管理…

Java学习之路 —— IO、特殊文件

文章目录 1. I/O1.1 常用API1.2 I/O流1.2.1 字节流1.2.2 try-catch-finally和try-with-resource1.2.3 字符流1.2.4 其他的一些流 2. I/O框架3. 特殊文件3.1. Properties3.2 XML 1. I/O 1.1 常用API // 1. 创建文件对象File file new File("E:\\ComputerScience\\java\\…

JAVA安全之Shrio550-721漏洞原理及复现

前言 关于shrio漏洞&#xff0c;网上有很多博文讲解&#xff0c;这些博文对漏洞的解释似乎有一套约定俗成的说辞&#xff0c;让人云里来云里去&#xff0c;都没有对漏洞产生的原因深入地去探究..... 本文从现象到本质&#xff0c;旨在解释清楚Shrio漏洞是怎么回事&#xff01…

(八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

​ 一、五种算法&#xff08;DBO、LO、SWO、COA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为…

JSP 报错 Cannot resolve method ‘print(java.lang.String)‘问题解决

这里 我写了一段比较基础的代码 <%// 定义局部变量String message "Hello, JSP!";out.print(message); %>但是 项目跑起来又是可以的 其实就是缺少了 JAR包 依赖 我们 可以在项目环境中找到 pom.xml dependencies标签内 加入 如下代码 <dependency>…

【1567.乘积为正数的最长子数组长度】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int getMaxLen(vector<int>& nums) {int nnums.size();vector<int> f(n);vector<int> g(n);f[0]nums[0]>0?1:0;g[0]nums[0]<0?1:0…

JS-项目实战-点击水果名修改特定水果库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name); //返回的是NodeList类型}} }//当…

Nginx 修改server_name后无法访问

问题&#xff1a; 在nginx.conf配置中, server_name 为 localhost 时可以正常访问&#xff0c;但改成自定义的域名后无法访问 解决方法&#xff1a; - Window系统 修改本地hosts文件&#xff0c;一般路径在&#xff1a;C:\Windows\System32\drivers\etc\hosts 在文件最后…

【Seata源码学习 】 篇二 TM与RM初始化过程

【Seata源码学习 】 篇二 TM与RM初始化过程 1.GlobalTransactionScanner 初始化 GlobalTransactionScanner 实现了InitializingBean 接口&#xff0c;在初始化后将执行自定义的初始化方法 io.seata.spring.annotation.GlobalTransactionScanner#afterPropertiesSet Override…

C++ 模板 (一)

1. 泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) { int temp left; left right; right temp; } void Swap(double& left, double& right) { double temp left; left right; right temp; } void Swap(char&…

【152.乘积最大子数组】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxProduct(vector<int>& nums) {int nnums.size();vector<int> f(n);vector<int> g(n);f[0]g[0]nums[0];int retnums[0];for(int i1;…

如何在聊天记录中实时查找大量的微信群二维码

10-5 如果你有需要从微信里收到的大量信息中实时找到别人发到群里的二维码&#xff0c;那本文非常适合你阅读&#xff0c;因为本文的教程&#xff0c;可以让你在海量的微信消息中&#xff0c;实时地把二维码自动挑出来&#xff0c;并且帮你分类保存。 如果你是做网推的&#…

【AI视野·今日NLP 自然语言处理论文速览 第六十五期】Mon, 30 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 30 Oct 2023 Totally 67 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers An Approach to Automatically generating Riddles aiding Concept Attainment Authors Niharika Sri Parasa,…

C#WPF文本转语音实例

本文介绍C#WPF文本转语音实例 实现方法:使用类库(SpeechSynthesizer )实现的。 一、首先是安装程序包。 二、创建项目 需要添加引用using System.Speech.Synthesis; UI界面 <Windowx:Class="TextToSpeechDemo.MainWindow"xmlns="http://schemas.micr…

PostgreSQL基于Citus实现的分布式集群

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

这五个步骤,网络有故障,自己都能解决

网络出现故障了怎么办&#xff1f;大部分弱电人一开始无从下手。 网络故障是弱电工作中最易常见的问题&#xff0c;尤其是我们弱电人经常与网络打交道&#xff0c;那么如何才能进行网络排查&#xff0c;快速解决问题呢&#xff1f; 解决和排查网络故障&#xff0c;要有基本的…

【漏洞复现】maccms苹果cms 命令执行漏洞

漏洞描述 感谢提供更多信息。“苹果CMS” 似乎是指 “Maccms”&#xff0c;这是一款开源的内容管理系统&#xff0c;主要用于搭建视频网站。Maccms 提供了一套完整的解决方案&#xff0c;包括用户管理、视频上传、分类管理、数据统计等功能&#xff0c;使用户能够方便地创建和…

Sentinel入门

一、Sentinel介绍 Sentinel 是阿里云开发的一款用于流量控制、熔断降级、系统负载保护的轻量级库。它可以帮助开发者保障系统的稳定性&#xff0c;在分布式服务架构中&#xff0c;Sentinel 能够对服务提供一定的保护&#xff0c;避免因为某个服务的故障而影响全局。 Sentinel …