算法---扫雷游戏

news/2024/11/24 9:33:59/

题目

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

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

‘M’ 代表一个 未挖出的 地雷,
‘E’ 代表一个 未挖出的 空方块,
‘B’ 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的 已挖出的 空白方块,
数字(‘1’ 到 ‘8’)表示有多少地雷与这块 已挖出的 方块相邻,
‘X’ 则表示一个 已挖出的 地雷。
给你一个整数数组 click ,其中 click = [clickr, clickc] 表示在所有 未挖出的 方块(‘M’ 或者 ‘E’)中的下一个点击位置(clickr 是行下标,clickc 是列下标)。

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

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

示例 1:
在这里插入图片描述

输入: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:
在这里插入图片描述

输入: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’

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minesweeper
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决思路

解决方法

    private val arrayOfIntArrays = arrayOf(//上intArrayOf(0, -1),//下intArrayOf(0, 1),//左下intArrayOf(-1, 1),//左intArrayOf(-1, 0),//右下intArrayOf(1, 1),//右intArrayOf(1, 0),//左上intArrayOf(-1, -1),//右上intArrayOf(1, -1))fun updateBoard(board: Array<CharArray>, click: IntArray): Array<CharArray> {if (board[click[0]][click[1]] == 'M'){board[click[0]][click[1]] = 'X'return board}dfs(board,click)return board}fun dfs(board: Array<CharArray>, click: IntArray){var count = 0arrayOfIntArrays.forEach {if (click[0] + it[0] in board.indices && click[1] + it[1] in 0 until  board[0].size){when (board[click[0] + it[0]][click[1] + it[1]]) {'M' -> {count += 1}}}}if(count == 0){board[click[0]][click[1]] = 'B'arrayOfIntArrays.forEach {if (click[0] + it[0] in board.indices && click[1] + it[1] in 0 until  board[0].size){when (board[click[0] + it[0]][click[1] + it[1]]){'E' -> {dfs(board, intArrayOf(click[0] + it[0],click[1] + it[1]))}}}}}else{board[click[0]][click[1]] = '0' + count}}

总结

1.历时3天。看评论才明白题意 满满的写出来了
2.总算明扫雷的逻辑和实现原理了
3.有的时候跑的慢不可怕,可怕的是一直不跑了


http://www.ppmy.cn/news/37900.html

相关文章

Servlet基础

快速入门 创建maven web项目&#xff0c;导入Servlet依赖坐标&#xff1a; <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>…

企业申请的ISO认证证书,证书状态如何辨别?

企业申请的ISO认证证书&#xff0c;证书状态如何辨别&#xff1f; 关于ISO证书的有效期及ISO证书年度监督审核规定&#xff1a; ISO证书的有效期&#xff1a;ISO认证证书的有效期为三年&#xff0c;每年进行年度监督审核。每次的年度监督审核时间间隔不能超过12个月&#xff0…

C++ Primer第五版_第九章习题答案(11~20)

文章目录练习9.11练习9.12练习9.13练习9.14练习9.15练习9.16练习9.17练习9.18练习9.19练习9.20练习9.11 对6种创建和初始化 vector 对象的方法&#xff0c;每一种都给出一个实例。解释每个vector包含什么值。 vector<int> vec; // 0 vector<int> vec(10); //…

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(上)

简介&#xff1a;摘自 尚硅谷雷锋阳老师的语雀文档 学会使用按量付费的云服务器&#xff0c;开发测试性价比高 私有网络VPC 和网络有关的概念&#xff0c;如何在云服务器开通一个集群 一个云服务器有两个IP&#xff1a;公网IP和私网IP 公网IP&#xff1a;对外暴露资源的访…

SpringBoot源码 | refreshContext方法解析

SpringBoot源码 | refreshContext方法解析SpringBootrefreshContext源码refresh方法prepareRefreshobtainFreshBeanFactoryprepareBeanFactorypostProcessBeanFactoryinvokeBeanFactoryPostProcessorsregisterBeanPostProcessorsinitMessageSourceinitApplicationEventMulticas…

730. 机器人跳跃问题(基础二分)

机器人正在玩一个古老的基于 DOS 的游戏。 游戏中有 N1N1 座建筑——从 00 到 NN 编号&#xff0c;从左到右排列。 编号为 00 的建筑高度为 00 个单位&#xff0c;编号为 ii 的建筑高度为 H(i)H(i) 个单位。 起初&#xff0c;机器人在编号为 00 的建筑处。 每一步&#xff…

如何防止softmax函数overflow和underflow?

上溢出&#xff1a;c极其大的时候&#xff0c;计算ece^cec下溢出&#xff1a;当c趋于负无穷的时候&#xff0c;分母是一个极小的数&#xff0c;导致下溢出 解决方法 令Mmax⁡xi,i1,2,⋯,nM\max{x_i}, i1,2,\cdots,nMmaxxi​,i1,2,⋯,n, 也就是所有xix_ixi​中的最大值&#xff…

android 应用性能监控软件,App性能监控工具,卡顿

(609条消息) android 应用性能监控软件,App性能监控工具_weixin_39940154的博客-CSDN博客 APP性能监测的各种工具 - ClareBaby01 - 博客园 (cnblogs.com) (609条消息) Android App性能监控工具_sdk 性能监测工具_一代小强的博客-CSDN博客 android studio自带Memory Monitor …