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

news2025/2/2 5:56:55

目录

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.coloradmin.cn/o/1555336.html

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

相关文章

k8s局域网通过operator部署rabbitmq

参考&#xff1a;Installing RabbitMQ Cluster Operator in a Kubernetes Cluster | RabbitMQ 1、下载cluster-operator.yml wget https://github.com/rabbitmq/cluster-operator/releases/download/v2.7.0/cluster-operator.yml 2、拉取对应的镜像&#xff0c;这里的版本是根…

【动态规划】1223. 掷骰子模拟

作者推荐 视频算法专题 LeetCode1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束&#xff0c;就是使得投掷骰子时&#xff0c;连续 掷出数字 i 的次数不能超过 rollMax[i]&#xff08;i 从 1 开始编号&#xff09…

跃然纸上的灵感再现,手绘风格的开源绘图白板工具:Excalidraw

Excalidraw&#xff1a;即绘即思&#xff0c;直观呈现未来流程图&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 在撰写文章或构建演示案例的过程中&#xff0c;为了增强视觉表现力和信息传达深度&#xff0c;适时融入图表或图形显得至关重要。Excalidraw作为一款基于…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释&#xff0c;我们可以自己来从官网下载源码编译生成对应的Jar包&#xff0c;然后上传到本地maven仓库&#xff0c;再引用这个Jar。大家可以自行去官…

Java 扫描某包下所有类的注解并获得注解值

背景 &#xff1a; 需求 需要获取某个包下的所有的注解 并不是全部项目的 所以 只用针对某个包 进行扫描 获取注解 数据就行 百度了一圈 spring boot 没有自带的 获取注解集合的方法 在看 php 中 hyperf 框架 看到了 这个方法 就是因为 我需求是 php 和java 合体 微服务开发 …

从代码生成工具看技术手段升级

从代码生成工具看技术手段升级 过去现在在日常工作中&#xff0c;你会用到代码生成工具吗&#xff1f;最喜欢哪一种呢&#xff1f;你一般使用代码生成工具来做什么&#xff1f;面对尚处于“成长期”的代码生成工具&#xff0c;你有哪些期待和诉求呢&#xff1f; 过去 在过去的…

小程序UI设计规范,界面设计尺寸详解

作为互联网技术的重要组成部分&#xff0c;小程序在日常生活中发挥着越来越重要的作用。因此&#xff0c;了解和严格遵守小程序的 UI 设计标准非常重要&#xff0c;它不仅可以帮助我们在保证良好用户体验的同时优化小程序&#xff0c;还可以使我们的产品在竞争激烈的市场中占据…

java中的继承和组合

继承 在java中继承指的是让类与类之间产生父子关系&#xff0c;被继承的类叫做父类或者基类、超类&#xff0c;继承的类叫做子类或者派生类。这里所说的继承和现实生活中的继承可以理解为同一个意思。当子类继承父类时&#xff0c;子类就能使用父类之中的非私有成员&#xff0c…

深度学习pytorch——卷积神经网络(持续更新)

计算机如何解析图片&#xff1f; 在计算机的眼中&#xff0c;一张灰度图片&#xff0c;就是许多个数字组成的二维矩阵&#xff0c;每个数字就是此点的像素值&#xff08;图-1&#xff09;。在存储时&#xff0c;像素值通常位于[0, 255]区间&#xff0c;在深度学习中&#xff0…

C++多线程:线程的创建、join、detach、joinable方法(二)

1、线程的开始与结束 程序运行起来&#xff0c;生成一个进程&#xff0c;该进程所持有的主线程开始自动运行&#xff0c;main主线程运行完所有的代码从main函数中返回表示整个进程运行完毕&#xff0c;标志着主线程和进程的死亡&#xff0c;等待操作系统回收资源&#xff0c;因…

五、基于KubeAdm搭建多节点K8S集群

如需查阅上一步骤,请点击下面链接:四、戴尔R630本地服务器Linux Centos7.9系统安装docker-ce-20.10.10-3.el7版本-CSDN博客文章浏览阅读727次,点赞12次,收藏13次。1、准备工作3、Linux Centos7.9系统的iDRAC远程管理、网络设置、SecureCRT远程登录终端、企业级静态ip地址配…

SpringBoot实现RabbitMQ的定向交换机(SpringAMQP 实现Direct定向交换机)

文章目录 Direct 交换机特点实战声明交换及其队列(以注解方式)发消息 应用 上一篇文章中的 Fanout 模式&#xff0c;一条消息&#xff0c;会被所有订阅其交换机的队列都消费。 但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到 Dir…

Unity-通过AB包使用SpriteAtlas图集(基于unity2018)

项目遇到了一个性能问题&#xff0c;需要优化UI。其中就涉及UI的合批问题&#xff0c;其中自然而然就会关联到图集的概念。旧版图集&#xff0c;Legacy Atlas&#xff0c;还没有太研究。今天主要看一下SpriteAtlas怎么使用的。 因为我们项目资源工程和Runtime是分离的&#xf…

(十二)图像的Sobel梯度锐化

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间&#xff1a;延迟队列消息过期 死信队列&#xff0c;所有消息过期时间一致 2. 设置消息的过期时间&#xff1a;此种方式下有缺陷&#xff0c;MQ只会判断队列第一条消息是否过期&#xff0c;会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…

327京东一面

1.项目相关 2.手撕SQL 两道 3.JMeter性能测试 首先&#xff0c;进行基准测试&#xff1a; 单用户测试&#xff08;单用户循环多次得到的数据&#xff09;&#xff1b;为多用户并发执行提供参考 其次&#xff0c;进行负载测试&#xff1a; 通过逐步增加系统负载&#xff0…

2024年水电站大坝安全监测工作提升要点

根据《水电站大坝运行安全监督管理规定》&#xff08;国家发改委令第23号&#xff09;和《水电站大坝运行安全信息报送办法》&#xff08;国能安全〔2016〕261号&#xff09;的相关规定、要求&#xff0c;电力企业应当在汛期向我中心报送每日大坝汛情。近期&#xff0c;全国各地…

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习&#xff0c;我想大家应该有了基本的理解&#xff0c;我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分&#xff0c;与其他QGL类一样&#xff0c;应该在新的应用程序中避免使用。相反&#xff0c;从Qt5.4开始…

蓝桥杯23年第十四届省赛真题-三国游戏|贪心,sort函数排序

题目链接&#xff1a; 1.三国游戏 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-三国游戏 - C语言网 (dotcpp.com) 虽然这道题不难&#xff0c;很容易想到&#xff0c;但是这个视频的思路理得很清楚&#xff1a; [蓝桥杯]真题讲解&#xff1a;三国游戏&#xff0…

备考ICA----Istio实验14---出向流量管控Egress Gateways实验

备考ICA----Istio实验14—出向流量管控Egress Gateways实验 1. 发布测试用 pod kubectl apply -f istio/samples/sleep/sleep.yaml kubectl get pods -l appsleep2. ServiceEntry 创建一个ServiceEntry允许流量访问edition.cnn.com egressgw/edition-ServiceEntry.yaml api…