【蓝桥杯选拔赛真题50】C++简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录

C++简易炸弹超人

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、程序说明

五、运行结果

六、考点分析

七、推荐资料


C++简易炸弹超人

第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题

一、题目要求

1、编程实现

有一块矩形游戏场地,场地被分成NxM的网格(4≤N≤100,4≤M≤10),其中一部分小方格是水域,另一部分小方格是陆地。为防御敌军攻击,玩家需要在游戏场地安置炸弹:

  1. 炸弹只能安置在陆地上;
  2. 每颗炸弹爆炸后,可以波及到炸弹所在的小方格,及相邻的上、下、左、右小方格;3.任意两颗炸弹爆炸后不能波及到同一个小方格。

请帮助玩家计算出如何安置炸弹,可以使炸弹波及到的范围最大,输出最多可以波及到的小方格数量。例如:N=4,M=4,网格中水域和陆地的情况如图1所示

这块4x4的矩形游戏场地最多可以波及到11个小方格,其他方案都不会优于这个结果
图中,蓝色区域代表水域,绿色区域代表陆地;安置炸弹的最优方案之一如图2所示;炸弹波及的范围如图3所示(黑色区域)。

2、输入输出

输入描述:第一行输入两个正整数N和M(4≤N≤100,4≤M≤10),分别表示网格的行数和列数,两个正整数之间以一个空格隔开。接下来输入N行,每行M个字符(字符只能是大写字母A或B),A表示水域,B表示陆地,字符之间以一个空格隔开.

输出描述:只有一行,一个整数,即最多可以波及到的小方格数量

输入样例:

4 4
B A A A
A B A B
B A B B
A B A A

输出样例:

11

二、算法分析

  1. 从给定题目的初步分析可以看出,本题具有一定的复杂度和难度的
  2. 这题的核心还是在算法的设计,从题意可以得到,需要计算的是波及方格数量最多
  3. 这就需要用到我们的动态规划算法进行实现
  4. 实现的思路是:根据输入的每个方格的初始状态,遍历每个是陆地的方格,进行炸弹的放置,然后根据当前方格影响到的上下左右四个方格的状态,统计出符合要求的受影响方格的数量,最后返回最大值

三、程序编写

#include <iostream>
#include <vector>
using namespace std;
const int N = 105, M = 12;
int n, m, grid[N], f[2][M][M];
vector<int> s;
bool check(int s) { return !(s & s >> 1 || s & s >> 2); }
bool check2(int s) { return s & s >> 1; }
int count(int x, int s) {int cnt = 0, flag = 0;for (int i = 0; i < m; i++)if (s >> i & 1) {flag = 1;if (x - 1 >= 1) cnt++;if (x + 1 <= n) cnt++;if (i - 1 >= 0) cnt++;if (i + 1 < m) cnt++;}return cnt + flag;
}
int main() {cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 0; j < m; j++) {char x;cin >> x;if (x == 'A')grid[i] += 1 << j;}for (int i = 0; i < 1 << m; i++)if (check(i))s.push_back(i); //动态规划算法实现for (int i = 1; i <= n + 2; i++)for (int j = 0; j < int(s.size()); j++)     for (int k = 0; k < int(s.size()); k++)   for (int u = 0; u < int(s.size()); u++) {int a = s[u], b = s[k], c = s[j];if ((a & b) || (b & c) || (a & c))continue;if ((grid[i] & c) || (grid[i - 1] & b))continue;if (check2(a | b))continue;int cnt = i <= n ? count(i, c) : 0;f[i & 1][j][k] = max(f[i & 1][j][k], f[(i - 1) & 1][k][u] + cnt);}cout << f[(n + 2) & 1][0][0] << endl;return 0;
}

四、程序说明

  1. 首先需要导入输入输出流头文件和vector头文件
  2. 然后是引入std命名空间中的所有成员到当前的程序中,这样在当前的程序中就可以直接使用 std 命名空间中的所有成员,而不需要使用的时候在成员前面加上(std::)前缀
  3. 定义了常量N和M,分别表示网格的行数和列数
  4. 接下来定义了全局变量n、m,分别表示输入的网格的行数和列数
  5. 还定义了一个长度为N的一维数组grid,用于存储输入的网格
  6. 然后定义了一个长度为2的二维数组f,用于存储动态规划的状态
  7. 定义了一个vector容器s,用于存储合法的状态
  8. 接下来定义了三个辅助函数,分别是check函数用于检查状态是否合法(不相邻的位置均为空),check2函数用于检查状态是否存在相邻的位置为空,count函数用于计算每个状态下填充的单元格数量。
  9. 主函数里面先读取输入的行数n和列数m,通过一个嵌套的循环遍历网格的每个单元格,将'A'表示的单元格使用位运算转化为二进制数并存储到grid数组中
  10. 接下来通过一个循环遍历所有可能的状态,并通过check函数筛选出合法的状态,将其存储到s容器中
  11. 使用动态规划的思想来解决问题。定义一个三维数组f,其中f[i][j][k]表示前i行,以第j个状态结尾的行和以第k个状态结尾的行的最大合法方案数
  12. 接下来的四重循环分别遍历了前i行的每一种可能的两个状态,以及第i+1行的所有合法状态
  13. 在每次迭代中,计算了前i行和第i+1行的状态之间的限制条件,并根据限制条件更新f数组
  14. 其中,a、b、c分别表示第i+1行、第i行、第i-1行的状态。如果a和b之间或b和c之间或a和c之间存在重叠的1,那么就跳过该状态,因为不满足合法条件。 如果第i+1行的状态与c重叠,或者第i行的状态与b重叠,那么也跳过该状态。 如果a和b合并之后的状态中存在连续两个1,也跳过该状态
  15. 最后输出f[(n + 2) & 1][0][0],即前n行以第0个状态结尾的方案的最大值
  16. 最后返回0,程序结束

 本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102

五、运行结果

7
You are too young!

六、考点分析

难度级别:难,这题相对而言还是有一定的难度,难在算法的设计实现,具体主要考查如下:

  1. 充分掌握变量的定义和使用
  2. 学会动态规划算法的定义和使用
  3. 学会vector容器的使用
  4. 学会输入流对象cin的使用,从键盘读入相应的数据
  5. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  6. 学会while循环的使用,在不确定循环次数的时候推荐使用
  7. 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
  8. 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
  9. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  10. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  11. 充分掌握变量定义和使用、分支语句、循环语句和动态规划算法知识的使用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

七、推荐资料

  • 所有考级比赛学习相关资料合集【推荐收藏】

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

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

相关文章

聊聊k8s服务发现的优缺点

序 本文主要研究一下使用k8s服务发现的优缺点 spring cloud vs kubernetes 这里有张spring cloud与kubernetes的对比&#xff0c;如果将微服务部署到kubernetes上面&#xff0c;二者有不少功能是重复的&#xff0c;可否精简。 这里主要是讲述一下如果不使用独立的服务发现&am…

SpringMVC注解及使用规则

文章目录 前言一、SpringMVC注解是什么&#xff1f;二、使用步骤1.注解使用2创建JSP3 SpringMVC视图1. 逻辑视图&#xff08;Logical View&#xff09;2. 物理视图&#xff08;Physical View&#xff09;区别和关系 4 SpringMVC注解总结 总结 前言 提示&#xff1a;这里可以添…

建立一个简单的网页音乐盒模型效果#css#h5

“音乐盒”可以看做一个大盒子&#xff0c;用<div>标签进行定义。大盒子的上面为文本内容&#xff0c;可以在<div>标签中嵌套<h2>和<p>标签来实现&#xff1b;大盒子下面为图像&#xff0c;通过在<div>标签中嵌套<img/>标签来实现。 样式…

[Python人工智能] 四十五.命名实体识别 (6)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型(注意力问题探讨)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。这篇文章将详细结合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别…

notepad++里安装32位和64位的16进制编辑器Hex-Editor

这个16进制编辑器确实是个好东西&#xff0c;平时工作种会经常用到&#xff0c; 这是hex-editor的官网。这个里边只能下载32位的(64位的看最下边)&#xff0c;选一个合适的版本&#xff0c;我当时选的是最新的版本 https://sourceforge.net/projects/npp-plugins/files/Hex%20E…

ARP协议定义及工作原理

ARP的定义 地址解析协议(Address Resolution Protocol&#xff0c;ARP)&#xff1a;ARP协议可以将IPv4地址(一种逻辑地址)转换为各种网络所需的硬件地址(一种物理地址)。换句话说&#xff0c;所谓的地址解析的目标就是发现逻辑地址与物理地址的映射关系。 ARP仅用于IPv4协议&a…

Centos服务器Open Gauss 部署

近期很多的项目由于信创要求使用一些国产的数据库&#xff0c;比如OpenGauss。OpenGuass是华为高斯DB的开源版&#xff0c;内核还是PostgreSQL&#xff0c;商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARM&#xff…

拆分巨石:将MVPS和MVAS应用于遗留应用程序——可持续架构(六)

前言 MVP 和 MVA 的概念不仅适用于新应用程序&#xff1b;它们提供了一种新颖的方式来审视对遗留系统的范围变更&#xff0c;以防止过快地承担过多的变化 - 参见图1。MVA 可以帮助组织评估和更新其技术标准&#xff0c;通过展示新技术如何真正对支持 MVP 至关重要。创建 MVA 可…

绿联 安装PDF工具

这是一个强大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker&#xff0c;允许您对 PDF 文件执行各种操作&#xff0c;例如拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序最初是 100% ChatGPT 制作的应用程序&#xff0c;现已发展…

BaseDao封装增删改查

文章目录 什么是BaseDao操作代码增删改查询单个数据查询多个数据 总结 什么是BaseDao BaseDao是&#xff1a; 数据库里负责增加&#xff0c;删除&#xff0c;修改&#xff0c;查询 具体来说是一种接口代码,公共方法的接口类。 在dao层新建basedao,其他dao层接口继承basedao 相…

代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树(JAVA)

文章目录 669. 修剪二叉搜索树解题思路源码 108. 将有序数组转换为二叉搜索树解题思路源码 538. 把二叉搜索树转换为累加树解题思路源码 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使…

【医学嵌入模型】中文医疗文本处理大模型 PCL-MedBERT

中文医疗文本处理大模型 PCL-MedBERT 提出背景对ELECTRA限制的深入分析eHealth的创新方法实体识别关系抽取 总结 最近再做医学项目&#xff0c;需要从文本中抽取医学概念和关系&#xff0c;通用模型的抽取效果还可以。 但还想找医学嵌入模型&#xff0c;能够更准确地从文本中识…

常见的Nginx+Redis+MQ+DB架构设计

三高&#xff0c;复杂的架构 SQRS CAP 缓存&#xff0c;限流 【Redis&#xff0c;缓存】 cache-aside 缓存cache&#xff1a;数据源的副本 store 1. Read/Write Through Pattern 读写穿透模式 redis&#xff1a;放当前在线用户&#xff0c;热点数据

第十四届蓝桥杯第十题:蜗牛分享

问题描述 输入格式 输出格式 输出共一行&#xff0c;一个浮点数表示答案&#xff08;四舍五入保留两位小数&#xff09;。 样例输入 3 1 10 11 1 1 2 1样例输出 4.20样例说明 蜗牛路线&#xff1a;(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1…

【C语言】结构体详解 (二) 内存函数、结构体传参

目录 1、 结构体的内存对齐 1.1、对齐规则 1.2、练习1、练习2&#xff08;演示对齐规则1、2、3、4&#xff09; 2、为什么存在内存对齐 2.1、平台原因&#xff08;移植原因&#xff09; 2.2、性能原因 2.3、那么如何即满足对齐&#xff0c;又要节省空间呢&#xff1f; …

element-ui inputNumber 组件源码分享

今日简单分享 inputNumber 组件的实现原理&#xff0c;主要从以下四个方面来分享&#xff1a; 1、inputNumber 组件的页面结构 2、inputNumber 组件的属性 3、inputNumber 组件的事件 4、inputNumber 组件的方法 一、inputNumber 组件的页面结构。 二、inputNumber 组件的…

在计算成像中集成物理和学习模型的即插即用方法

即插即用就是把算法的近端算子换成去噪器 摘要 即插即用先验(PnP)是通过物理模型和学习模型的集成来解决计算成像问题的最广泛使用的框架之一。PnP利用高保真物理传感器模型和强大的机器学习方法对数据进行先验建模&#xff0c;以提供最先进的重建算法。PnP算法在最小化数据保…

零基础教程:R语言lavaan结构方程模型(SEM)

查看原文>>>最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;实践技术应用 基于R语言lavaan程序包&#xff0c;通过理论讲解和实际操作相结合的方式&#xff0c;由浅入深地系统介绍结构方程模型的建立、拟合、评估、筛选和结果展示的全过程。我们筛选大量…

07-工作流设计:如何设计合理的多人开发模式?

一个企业级项目是由多人合作完成的&#xff0c;不同开发者在本地开发完代码之后&#xff0c;可能提交到同一个代码仓库&#xff0c;同一个开发者也可能同时开发几个功能特性。这种多人合作开发、多功能并行开发的特性如果处理不好&#xff0c;就会带来诸如丢失代码、合错代码、…

echarts 旭日图 层级嵌套

基础的可以直接参考官网进行配置。 Echarts旭日图的特点如下&#xff1a; 1 层次结构展示&#xff1a;旭日图适用于展示层次结构数据&#xff0c;通过不同的扇形区域来表示不同层次的数据。每个扇形区域的大小和位置表示了数据的大小和层次关系。 2 渐进式呈现&#xff1a;旭…