扫雷(蓝桥杯,acwing)
题目描述:
扫雷是一种计算机游戏,在 2020 世纪 80 年代开始流行,并且仍然包含在某些版本的 Microsoft Windows 操作系统中。
在这个问题中,你正在一个矩形网格上玩扫雷游戏。
最初网格内的所有单元格都呈未打开状态。
其中 M个不同的单元格中隐藏着 M 个地雷。
其他单元格内不包含地雷。
你可以单击任何单元格将其打开。
如果你点击到的单元格中包含一个地雷,那么游戏就会判定失败。
如果你点击到的单元格内不含地雷,则单元格内将显示一个 0 到 8 之间的数字(包括 0 和 8),这对应于该单元格的所有相邻单元格中包含地雷的单元格的数量。
如果两个单元格共享一个角或边,则它们是相邻单元格。
另外,如果某个单元格被打开时显示数字 0,那么它的所有相邻单元格也会以递归方式自动打开。
当所有不含地雷的单元格都被打开时,游戏就会判定胜利。
例如,网格的初始状态可能如下所示(*
表示地雷,而 c
表示第一个点击的单元格):
*..*...**.
....*.....
..c..*....
........*.
..........
被点击的单元格旁边没有地雷,因此当它被打开时显示数字 00,并且它的 88 个相邻单元也被自动打开,此过程不断继续,最终状态如下:
*..*...**.
1112*.....
00012*....
00001111*.
00000001..
此时,仍有不包含地雷的单元格(用 .
字符表示)未被打开,因此玩家必须继续点击未打开的单元格,使游戏继续进行。
你想尽快赢得游戏胜利并希望找到赢得游戏的最低点击次数。
给定网格的尺寸(N×N ),输出能够获胜的最小点击次数。
输入格式:
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含整数 N,表示游戏网格的尺寸大小。
接下来 N 行,每行包含一个长度为 N 的字符串,字符串由 .
(无雷)和 *
(有雷)构成,表示游戏网格的初始状态。
输出格式:
每组数据输出一个结果,每个结果占一行。
结果表示为 Case #x: y
,其中 x 是组别编号(从 1 开始),y 是获胜所需的最小点击次数。
数据范围:
1≤T≤100
1≤N≤300
输入样例:
2
3
..*
..*
**.
5
..*..
..*..
.*..*
.*...
.*...
输出样例:
Case #1: 2
Case #2: 8
分析步骤:
第一:拿到题目我们应该会比较熟悉,因为这游戏从小我们就开始玩,规则也比较简单。我们需要找到所有不是地雷的点,其中如果你点到的地方周围一圈都是没有地雷的话,那么这个点就可以向外递归,直到遍历到的点周围有地雷,就停止(就像游戏中你点到周围没有地雷的点,系统会自动显示出这一片区域的值)。我们就从这里可以知道,我们先把所有周围没有地雷的点,也就是0的点全部都点掉,那么我们就会收获绝大多数的空间,最后在遍历一遍没有被遍历的点,将他们单独点一边加上这些操作数,就可以得到最小的点击次数。
第二:从第一步我们可以知道我们需要找到哪些是为0的点,哪些点是周围有地雷的点,哪些点是地雷点。
第三:书写主函数,构建整体架构:
输入值,地图。之后我们遍历一遍每一个点,如果这个点是地雷点的话,那么我们就把这个点规定为 -1(下文也是这样);如果不是地雷的话,那么我们就先将这个点定义为0,再从这个点向外去寻找,如果这个点的周围找到了一个地雷的话我们就将这个点的数值++(数值是几,就代表周围有几个地雷)。注意是将g[i][j]++;而不是(x,y)这对坐标,因为我们去找的出发点是(i,j); for(int x = i - 1 ; x <= i + 1 ; x ++) ; for(int y = j - 1 ; y <= j + 1 ; y++) 大家要好好理解一下,这两层for就是在这个点的上一层,这一层,下一层的周围一圈的点遍历一遍。
for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){if(str[i][j] == '*') g[i][j] = -1;else {g[i][j] = 0;for(int x = i - 1 ; x <= i + 1 ; x ++){for(int y = j - 1 ; y <= j + 1 ; y++){if(x >= 0 and y >= 0 and x < n and y < n and str[x][y] == '*')g[i][j]++;}}}}}
我们将地图的每一个点都遍历一遍,知道了哪些点是0,哪些点周围有地雷,知道了这个之后,我们就先去遍历地雷数为0的点。这样操作有利于用最小的操作步数,换得尽可能多的信息,所以必须先点击地雷数为0的点。这个点是0值点就res+= , 进入搜索
int res = 0 ;for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){if(!g[i][j]){res++;dfs(i,j);} }}
遍历完这些之后,在遍历每一个点,看看有没有漏网之鱼。因为有些点周围一圈可能都是地雷,所以会点击不到,要再单独遍历一遍。没被点击的话就单独点击,res++。
for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){if(g[i][j] != -1){res++;} }}
第四:书写dfs
我们先将t储存g的值,并将此点定义为-1(代表着地雷,也代表着不能遍历了所以一样的)。再去遍历这个点周围一圈,只要不是地雷,或者没有越界,就继续递归。
void dfs(int x , int y){int t = g[x][y];g[x][y] = -1;if(t) return ;for(int i = x - 1 ; i <= x + 1 ; i ++){for(int j = y - 1; j <= y + 1 ; j ++){if(i >= 0 and j >= 0 and i < n and j < n and g[i][j] != -1)dfs(i,j);}}
}
代码:
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 310;int g[N][N];
char str[N][N];
int m , n;void dfs(int x , int y){int t = g[x][y];g[x][y] = -1;if(t) return ;for(int i = x - 1 ; i <= x + 1 ; i ++){for(int j = y - 1; j <= y + 1 ; j ++){if(i >= 0 and j >= 0 and i < n and j < n and g[i][j] != -1)dfs(i,j);}}
}int main()
{cin>>m;for(int cases = 1 ; cases <= m ; cases ++){cin>>n;for(int i = 0 ; i < n ; i ++) cin>>str[i];for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){if(str[i][j] == '*') g[i][j] = -1;else {g[i][j] = 0;for(int x = i - 1 ; x <= i + 1 ; x ++){for(int y = j - 1 ; y <= j + 1 ; y++){if(x >= 0 and y >= 0 and x < n and y < n and str[x][y] == '*')g[i][j]++;}}}}}int res = 0 ;for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){if(!g[i][j]){res++;dfs(i,j);} }}for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){if(g[i][j] != -1){res++;} }}printf("Case #%d: %d\n" , cases , res);}return 0;
}
相关文章:
扫雷(蓝桥杯,acwing)
题目描述: 扫雷是一种计算机游戏,在 2020 世纪 80 年代开始流行,并且仍然包含在某些版本的 Microsoft Windows 操作系统中。 在这个问题中,你正在一个矩形网格上玩扫雷游戏。 最初网格内的所有单元格都呈未打开状态。 其中 M个…...

macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
如果你通过 sudo port install 命令正常安装了 MySQL,再通过 sudo port load 命令启动了 MySQL Server,此刻却发现使用 Navicat 之类的 GUI 软件无法连接,始终返回无法连接到 127.0.0.1 服务器。这是一个小坑,因为他默认使用了 So…...
Semi-supervised Open-World Object Detection
Semi-supervised Open-World Object Detection 摘要1 介绍2.准备工作提出的SS-OWOD问题设置2.1 基础架构3 方法3.1整体架构摘要 传统的开放世界对象检测(OWOD)问题设置首先区分已知和未知类别,然后在后续任务中引入标签时逐步学习未知对象。然而,当前的OWOD公式在增量学习…...
C语言实现射击小游戏
以下是一个简单的C语言射击小游戏的实现示例。这个游戏中,玩家控制一个飞船,敌方飞船会随机出现并向玩家移动。如果玩家的飞船与敌方飞船相撞,玩家就失去一条生命,代码如下: #include <stdio.h> #include <s…...
c++11 标准模板(STL)本地化库 - std::islower(std::locale) 检查字符是否被本地环境分类为小写
本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 检查字符是否被本地环境分类为小写 std::islower(std::locale) template&…...

粘度指数改进剂市场需求增长 为润滑油添加剂细分产品
粘度指数改进剂市场需求增长 为润滑油添加剂细分产品 粘度指数改进剂是一种油溶性高分子聚合物,主要用于提高润滑油粘度以及粘度指数。粘度指数改进剂具有稠化能力强、抗磨性好、热稳定性好等优势,可添加于液压油、内燃机油以及齿轮油等油品中。 …...

LabVIEW柴油机安保监控系统
LabVIEW柴油机安保监控系统 随着航运业的快速发展,确保船舶柴油机的安全稳定运行变得尤为重要。船舶柴油机故障不仅会导致重大的经济损失,还可能危及人员安全和环境。设计并开发了一套基于LabVIEW平台的柴油机安保监控系统,旨在通过实时监控…...

实测国内AI大模型问答效果
随着ChatGPT热度的攀升,越来越多的公司也相继推出了自己的AI大模型。按照github工程awesome-LLMs-In-China所列举的,现如今国内AI大模型已达243个,比较著名的有文心一言、通义千问等。各大应用也开始内置AI玩法,如抖音的AI特效。下…...
不得不等待的无奈 -《葡萄成熟时》
恋上一个人便是撒下一颗葡萄种子,你可能会坚持,但不一定会结果,收获(在一起)。 更有可能得到的是枯枝烂叶(ta的离开)。 就算你再努力,再用心去栽培(为ta付出࿰…...
【Python】Python中装饰器和魔法方法的区别
在Python中,装饰器(Decorators)和魔法方法(Magic Methods)是两种不同的高级特性,分别服务于不同的目的。 装饰器 (Decorators) 装饰器是一种强大的工具,它可以修改或增强函数、方法或类的行为…...
【React】创建你的第一个React组件
要使用React创建你的第一个组件,首先确保你已经安装了Node.js和npm(Node包管理器)。然后,你可以通过npm安装Create React App这个官方支持的脚手架工具来快速生成一个新的React应用项目,该项目包含了React、ReactDOM、…...

五分钟搞懂MySQL索引下推
什么是索引下推 索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。 索引下推优化的原理 我们先简单了解一下MySQL大概的架构: MySQL服务层负责SQL语法解析、…...
【数据库】SQL如何添加数据
在SQL中,您可以使用INSERT INTO语句来添加数据到数据库表中。以下是一些基本的示例和解释: 1.插入完整行数据: 如果您想为表中的每一列都插入数据,那么可以不必指定列名。但是,您需要为每一列都提供数据,并…...

ClickHouse01-什么是ClickHouse
什么是ClickHouse? 关于发展历史存在的优势与劣势什么是它风靡的原因? 什么是ClickHouse? 官方给出的回答是,它是一个高性能、列式存储、基于SQL、供在线分析处理的数据库管理系统 当然这边不得不提到OLAP(Online Analytical Pr…...
使用Docker搭建Nascab
使用Docker来部署Nascab能够让这个过程变得更加灵活和便捷,因为Docker可以在隔离的环境中运行应用程序,简化了部署和配置的复杂性。 使用Docker CLI部署Nascab docker run -d \ --name nascab \ -p 18080:80 \ -p 18443:443 \ -p 18090:90 \ -p 18021:…...

Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改
前言 并发控制,一般有两种方案,悲观锁和乐观锁,其中悲观锁是默认每次更新操作肯定会冲突,所以每次操作都要先获取锁,操作完毕再释放锁,适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…...

Docker 安装 Skywalking以及UI界面
关于Skywalking 在现代分布式系统架构中,应用性能监控(Application Performance Monitoring, APM)扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking,通过对其功能特性和工作原理的详细介绍&am…...

mysql 空间查询 多边形内的点
数据库查询 # 1新增空间point类型坐标字段 ALTER TABLE gaoxin_isdp.business_master ADD COLUMN location2 point NULL AFTER location;# 2从原字段更新点位字段,原字段poi1是字符串106.474596,29.464360 UPDATE business_master SET location POINT(substr(poi…...
实际开发中,git版本切换操作
业务场景 客户环境需要部署当前分支的之前的一个版本代码,所以需要从当前的commit切换到之前的commit 版本切换步骤 查看版本提交日志 $ git reflog切换版本 git reset --hard 七位数的版本id在切换后的版本上更改代码后 执行完暂存 git commit 把回退后的代码提…...

线程池实现“线程复用”的原理
线程池实现“线程复用”的原理 学习线程复用的原理,以及对线程池的 execute 这个非常重要的方法进行源码解析。 线程复用原理 我们知道线程池会使用固定数量或可变数量的线程来执行任务,但无论是固定数量或可变数量的线程,其线程数量都远远…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...