扫雷(蓝桥杯,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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(附源码)基于Spring Boot + Vue的校园综合信息服务平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

牛客NC196 编辑距离(一)【较难 DFS/DP,动态规划,样本对应模型 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6a1483b5be1547b1acd7940f867be0da 思路 编辑距离问题 什么是两个字符串的编辑距离&#xff08;edit distance&#xff09;&#xff1f;给定字符串s1和s2&#xff0c;以及在s1上的如下操作&#xff1a;插入&…

基于springboot的大学生租房平台系统

技术&#xff1a;springbootmysqlvue 一、系统背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对大学生租房信息管理混乱…

基于小波神经网络的回归分析,基于ANN的回归分析

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 小波神经网络(以小波基为传递函数的BP神经网络) 代码链接:小波神经网络回归分析,小波分解+BP神经网络-机器学习文档类资源-CSDN文库 …

Nginx:部署及配置详解(linux)

Nginx&#xff1a;部署及配置详解&#xff08;linux&#xff09; 1、nginx简介2、安装编译工具及库文件3、安装 pcre4、nginx安装5、nginx配置文件nginx.conf组成6、nginx配置实例-反向代理7、nginx 配置实例-负载均衡 &#x1f496;The Begin&#x1f496;点点关注&#xff0c…

长连接技术

个人学习记录&#xff0c;欢迎指正 1.轮询 1.1 轮询的形式 短连接轮询 前端每隔一段时间向服务端发起一次Http请求来获取数据。 const shortPolling () > { const intervalHandler setInterval(() > {fetch(/xxx/yyy).then(response > response.json()).then(respo…

HarmonyOS NEXT应用开发之跨文件样式复用和组件复用

介绍 本示例主要介绍了跨文件样式复用和组件复用的场景。在应用开发中&#xff0c;我们通常需要使用相同功能和样式的ArkUI组件&#xff0c;例如购物页面中会使用相同样式的Button按钮、Text显示文字&#xff0c;我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组…

力扣4寻找两个正序数组的中位数

1.实验内容 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 2.实验目的 算法的时间复杂度应该为 O(log (mn)) 。 3.基本思路 碰到时间复杂度要求log的&#xff0c;肯定用二分查找&…

【Markdown】【mermaid】Mermaid流程图基础语法Flowcharts - Basic Syntax

流程图 - 基础语法 流程图简介节点默认节点带文本的节点Unicode 文本Markdown 格式化 流程图方向节点形状圆角矩形节点体育场形节点子程序形节点圆柱形节点圆形节点不对称节点菱形节点六边形节点平行四边形节点另一种平行四边形节点梯形节点另一种梯形节点双圆节点 节点之间的连…

shell编程入门(笔记)

1、shell编程基础&#xff1a; 1.1、shell的解释执行功能 1.2、什么是shell程序&#xff1f; 1.3、shell程序编程的主要内容 1.4、shell程序的第一行 1.5、变量要求 1.6、环境变量和只读变量 1.7、位置参量 1.8、位置参量列表 1.9、数组 2、输入输出 2.1、输入-read命令 2.2…

Pytest用例间参数传递的两种实现方式示例

前言 我们在做接口自动化测试的时候&#xff0c;会经常遇到这种场景&#xff1a;接口A的返回结果中的某个字段&#xff0c;是接口B的某个字段的入参。如果是使用postman&#xff0c;那我们可以通过设置后置变量&#xff0c;然后在需要使用的地方通过{{}}的方式来进行调用。但是…

[LLM]大模型基础知识点--大模型与LLM

1、什么是大模型&#xff1f; 定义&#xff1a;在机器学习领域&#xff0c;"大模型"通常指的是拥有大量参数的深度学习模型。这些模型通常由数十亿甚至数千亿个参数组成。 特点&#xff1a;由于参数众多&#xff0c;这些模型能够从大量数据中学习复杂的模式和关系。…

OJ : 1087 : 获取出生日期(多实例测试)

题目描述 输入某人的18位身份证号&#xff0c;输出其出生日期。 输入 多实例测试。首先输入一个整数n&#xff0c;表示测试实例的个数&#xff0c;然后是n行&#xff0c;每行是一个18位身份证号。 输出 对于输入的每个身份证号&#xff0c;输出一行&#xff0c;即其对应的…

SpringMVC 的运行流程

Spring MVC 是一个基于 MVC 设计模式的 Web 框架&#xff0c;它提供了一种优雅的方式来构建 Web 应用程序&#xff0c;将应用程序的不同部分分离开来&#xff0c;以便更好地管理和维护。了解 Spring MVC 的运行流程对于理解它的工作原理以及在实际项目中的应用非常重要。 1. 请…

银行卡账户交易异常已被限制部分功能,怎么办?

文章目录 I 解决方案1.1 限制原因1.2 防范1.3 案例1.4 用卡安全小知识II 个人账户收款监管规则III 反诈提醒I 解决方案 处理非柜面交易限制,只能到开户行柜台申请解除。异地卡的,需要联系开户行,提供相关资料。有些地方银行的,比如长沙银行,可以使用线上柜台进行审核。先到…

# termux连接云服务器

termux使用 pkg install openssh 连接服务器 ssh root39.100.181.23 安装postgres

不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette

transformers4.30.2支持的SSE-Starlette版本是0.14.0

Flume入门概述及安装部署

目录 一、Flume概述1.1 Flume定义1.2 Flume基础架构 二、Flume安装部署 一、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础…

Python实现计算复读次数(附带源码)

在Python中&#xff0c;可以使用以下几种方法计算复读次数&#xff1a; 方法一&#xff1a;使用count()函数 count()函数用于统计字符串中某个字符或子字符串出现的次数。 示例&#xff1a; Python # 计算字符串中 "a" 出现的次数 count "hello world&quo…

13、Deconstructing Denoising Diffusion Models for Self-Supervised Learning

简介 研究了最初用于图像生成的去噪扩散模型(DDM)的表示学习能力 解构DDM&#xff0c;逐步将其转变为经典的去噪自动编码器(DAE) 探索现代ddm的各个组成部分如何影响自监督表征学习 结论&#xff1a; 只有很少的现代组件对于学习良好的表示是至关重要的&#xff0c;而其他许多…