2023年03月 C/C++(八级)真题解析#中国电子学会#全国青少年软件编程等级考试

在这里插入图片描述

C/C++编程(1~8级)全部真题・点这里

第1题:最短路径问题

平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。
若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。
时间限制:1000
内存限制:131072
输入
共n+m+3行,其中: 第一行为整数n。 第2行到第n+1行(共n行) ,每行两个整数x和y,描述了一个点的坐标。 第n+2行为一个整数m,表示图中连线的个数。 此后的m 行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。 最后一行:两个整数s和t,分别表示源点和目标点。
输出
仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度。
样例输入
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
样例输出
3.41

以下是一个解决最短路径问题的C语言程序:

#include <stdio.h>
#include <math.h>#define MAXN 101typedef struct {int x, y;
} Point;double dist(Point p1, Point p2) {int dx = p2.x - p1.x;int dy = p2.y - p1.y;return sqrt(dx * dx + dy * dy);
}int main() {int n;scanf("%d", &n);Point points[MAXN];int i;for (i = 0; i < n; i++) {scanf("%d %d", &points[i].x, &points[i].y);}int m;scanf("%d", &m);int edges[MAXN][MAXN] = {0};int j;for (j = 0; j < m; j++) {int u, v;scanf("%d %d", &u, &v);edges[u][v] = 1;edges[v][u] = 1;}int s, t;scanf("%d %d", &s, &t);double dist[MAXN];int visited[MAXN] = {0};for (i = 0; i < n; i++) {dist[i] = INFINITY;}dist[s] = 0;for (i = 0; i < n - 1; i++) {int minDistIndex = -1;double minDist = INFINITY;for (j = 0; j < n; j++) {if (!visited[j] && dist[j] < minDist) {minDist = dist[j];minDistIndex = j;}}visited[minDistIndex] = 1;for (j = 0; j < n; j++) {if (!visited[j] && edges[minDistIndex][j] && dist[minDistIndex] + dist(points[minDistIndex], points[j]) < dist[j]) {dist[j] = dist[minDistIndex] + dist(points[minDistIndex], points[j]);}}}printf("%.2lf\n", dist[t]);return 0;
}

在这个解决方案中,我们使用了Dijkstra算法来求解最短路径问题。

首先,我们定义了一个结构体Point来表示平面上的点,包含x和y坐标。

然后,我们定义了一个dist函数来计算两点之间的直线距离。

在主函数中,我们首先读取输入的点的数量n。

然后,我们读取n行,每行包含两个整数x和y,表示一个点的坐标。

接下来,我们读取连线的数量m。

然后,我们读取m行,每行包含两个整数i和j,表示第i个点和第j个点之间有连线。

最后,我们读取源点s和目标点t。

接下来,我们创建一个邻接矩阵edges来表示点之间的连线关系。将连线的两个点在邻接矩阵中标记为1,表示有连线。

我们还创建一个距离数组dist来存储从源点到各个点的最短距离。

然后,我们进行n-1轮迭代,每次选择距离最小的未访问点,更新该点到其他未访问点的距离。

最后,输出从源点到目标点的最短路径长度。

综上所述,这个C语言程序可以根据输入的点的坐标和连线关系,求解从源点到目标点的最短路径长度,并输出结果。

第2题:Freda的越野跑

Freda报名参加了学校的越野跑。越野跑共有N人参加,在一条笔直的道路上进行。这N个人在起点处站成一列,相邻两个人之间保持一定的间距。比赛开始后,这N个人同时沿着道路向相同的方向跑去。换句话说,这N个人可以看作x轴上的N个点,在比赛开始后,它们同时向x轴正方向移动。
假设越野跑的距离足够远,这N个人的速度各不相同且保持匀速运动,那么会有多少对参赛者之间发生“赶超”的事件呢?
时间限制:1000
内存限制:262144
输入
第一行1个整数N。 第二行为N 个非负整数,按从前到后的顺序给出每个人的跑步速度。 对于50%的数据,2<=N<=1000。 对于100%的数据,2<=N<=100000。
输出
一个整数,表示有多少对参赛者之间发生赶超事件。
样例输入
5
1 3 10 8 5
样例输出
7
提示
我们把这5个人依次编号为A,B,C,D,E,速度分别为1,3,10,8,5。 在跑步过程中: B,C,D,E均会超过A,因为他们的速度都比A快; C,D,E都会超过B,因为他们的速度都比B快; C,D,E之间不会发生赶超,因为速度快的起跑时就在前边。

以下是一个解决Freda的越野跑问题的C语言程序:

#include <stdio.h>int main() {int N;scanf("%d", &N);int speeds[N];int i;for (i = 0; i < N; i++) {scanf("%d", &speeds[i]);}int count = 0;int maxSpeed = speeds[N - 1];for (i = N - 2; i >= 0; i--) {if (speeds[i] > maxSpeed) {count++;} else {maxSpeed = speeds[i];}}printf("%d\n", count);return 0;
}

在这个解决方案中,我们首先读取输入的参赛者数量N。

然后,我们创建一个长度为N的整数数组speeds来存储每个参赛者的速度。

接下来,我们使用一个循环读取N个非负整数,分别表示每个参赛者的速度,并将其存储在数组speeds中。

然后,我们初始化一个变量count为0,用于计数赶超事件的数量。

我们还定义一个变量maxSpeed,用于记录当前已经遍历的参赛者中的最大速度。

接下来,我们从倒数第二个参赛者开始向前遍历,比较每个参赛者的速度和当前最大速度。

如果某个参赛者的速度大于当前最大速度,说明发生了一次赶超事件,我们将count加1。

否则,更新maxSpeed为当前参赛者的速度,因为速度较慢的参赛者不会再被之后速度较快的参赛者赶超。

最后,输出count,表示发生赶超事件的数量。

综上所述,这个C语言程序可以根据输入的参赛者速度,计算出有多少对参赛者之间发生赶超事件,并输出结果。

第3题:社交网络

随着社交平台的兴起,人们之间的沟通变得越来越密切。通过Facebook的分享功能,只要你是对方的好友,你就可以转发对方的状态,并且你的名字将出现在“转发链”上。经过若干次转发以后,很可能A分享了一条好友C的状态,而C的这条状态实际上是分享B的,但A与B可能并不是好友,即A通过C间接分享了B的状态。
给定你N个人之间的好友关系,好友关系一定是双向的。只要两个人是好友,他们就可以互相转发对方的状态,无论这条状态是他自己的,还是他转发了其他人的。现在请你统计,对于每两个人,他们是否有可能间接转发对方的状态。
时间限制:1000
内存限制:262144
输入
第一行1个整数N(1<=N<=300)。 接下来N行每行N个整数,表示一个NN的01矩阵,若矩阵的第i行第j列是1,表示这两个人是好友,0则表示不是好友。 保证矩阵的主对角线上都是1,并且矩阵关于主对角线对称。
输出
一个N
N的01矩阵,若矩阵的第i行第j列是1,表示这两个人可能间接转发对方的状态,0则表示不可能。
样例输入
5
11000
11100
01100
00011
00011
样例输出
11100
11100
11100
00011
00011
提示
在输入数据中,1与2是好友,2与3是好友,4与5是好友。 因此1、2、3有可能互相转发状态;4、5有可能互相转发状态。这两组人之间则不可能。

以下是一个解决社交网络问题的C语言程序:

#include <stdio.h>void calculateIndirectConnections(int N, int friends[][N], int indirectConnections[][N]) {int i, j, k;// 初始化indirectConnections矩阵为friends矩阵的拷贝for (i = 0; i < N; i++) {for (j = 0; j < N; j++) {indirectConnections[i][j] = friends[i][j];}}// 使用Warshall算法计算间接转发关系for (k = 0; k < N; k++) {for (i = 0; i < N; i++) {for (j = 0; j < N; j++) {if (indirectConnections[i][k] && indirectConnections[k][j]) {indirectConnections[i][j] = 1;}}}}
}int main() {int N;scanf("%d", &N);int friends[N][N];int i, j;for (i = 0; i < N; i++) {for (j = 0; j < N; j++) {scanf("%d", &friends[i][j]);}}int indirectConnections[N][N];calculateIndirectConnections(N, friends, indirectConnections);// 输出indirectConnections矩阵for (i = 0; i < N; i++) {for (j = 0; j < N; j++) {printf("%d", indirectConnections[i][j]);}printf("\n");}return 0;
}

在这个解决方案中,我们首先读取输入的人数N。

然后,我们创建一个大小为N×N的二维数组friends,用于存储好友关系。我们使用两层循环读取N行N列的二进制矩阵,并将其存储在friends数组中。

接下来,我们创建一个大小为N×N的二维数组indirectConnections,用于存储间接转发关系。我们将friends数组的内容复制到indirectConnections数组中,作为初始的间接转发关系。

然后,我们使用Warshall算法来计算间接转发关系。通过三重循环遍历indirectConnections数组,如果第i个人与第k个人以及第k个人与第j个人存在间接转发关系,则更新第i个人与第j个人之间的间接转发关系为1。

最后,我们输出indirectConnections矩阵,即每两个人之间可能的间接转发关系。

综上所述,这个C语言程序可以根据好友关系,计算出每两个人之间是否可能存在间接转发关系,并输出结果。

第4题:旅行

转眼毕业了,曾经朝夕相处的同学们不得不都各奔东西,大家都去了不同的城市开始新的生活。在各自城市居住了一段时间后,他们都感到了一些厌倦,想去看看其他人的生活究竟如何,于是他们都选择到另一个同学所在城市去旅游,并且希望旅游的城市各不相同,他们想知道有多少种不同的方案,可是数量实在太多了,他们无法计算出来,你能帮助他们吗。
时间限制:10000
内存限制:131072
输入
一个正整数n(n<200),表示人数。
输出
一个数,表示有多少不同的方案。
样例输入
3
样例输出
2
提示
有如下两种方案: 同学1去同学2的城市,同学2去同学3的城市,同学3去同学1的城市; 同学1去同学3的城市,同学3去同学2的城市,同学2去同学1的城市。

这个问题可以使用动态规划来解决。我们可以将旅行的方案数量表示为一个状态转移方程,并使用动态规划的方法计算出所有可能的方案数量。

以下是一个解决旅行问题的C语言程序:

#include <stdio.h>#define MAX_N 200long long int travelPlans(int n) {// 创建一个大小为n的数组,用于存储状态转移方程的结果long long int dp[MAX_N];// 初始化dp数组dp[1] = 0;dp[2] = 1;int i;for (i = 3; i <= n; i++) {// 使用状态转移方程计算dp[i]dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2]);}return dp[n];
}int main() {int n;scanf("%d", &n);long long int result = travelPlans(n);printf("%lld\n", result);return 0;
}

在这个解决方案中,我们首先读取输入的人数n。

然后,我们创建一个大小为MAX_N的数组dp,用于存储状态转移方程的结果。

接下来,我们初始化dp数组的前两个元素,dp[1]为0,dp[2]为1。

然后,我们使用一个循环从3到n,计算dp[i]的值。根据状态转移方程,dp[i]等于(i-1)乘以(dp[i-1]+dp[i-2])。

最后,我们输出dp[n],即旅行的方案数量。

综上所述,这个C语言程序可以根据输入的人数,计算出旅行的不同方案数量,并输出结果。

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

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

相关文章

运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数|函数递归调用|函数后台执行

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

Blender中的高级边缘控制和纹理映射

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 步骤 1 首先&#xff0c;您需要创建一组无阴影材质&#xff0c;每种材质具有不同的颜色&#xff0c;确保您有足够的材质来覆盖模型&#xff0c;而不会有相同的颜色相互重叠。然后&#xff0c;切换到“着色”&#xff…

前端自动化部署,Devops,CI/CD

DevOps 提到 Jenkins&#xff0c;想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合&#xff0c;是一种方法论&#xff0c;并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…

百度云智大会:科技与创新的交汇点

​ 这次的百度云智大会&#xff0c;可谓是亮点云集—— 发布了包含42个大模型、41个数据集、10个精选应用范式的全新升级千帆大模型平台2.0&#xff0c;发布首个大模型生态伙伴计划&#xff0c;而且也预告了文心大模型4.0的发布&#xff0c;大模型服务的成绩单也非常秀&#x…

2023数学建模国赛E题黄河水沙监测数据分析完整代码分析+处理结果+思路文档

已经写出国赛E题黄河水沙监测数据分析完整代码分析处理结果思路分析&#xff08;30页&#xff09;&#xff0c;包括数据预处理、数据可视化&#xff08;分组数据分布图可视化、相关系数热力图可视化、散点图可视化&#xff09;、回归模型&#xff08;决策树回归模型、随机森林回…

Linux:【Mysql】Centos7安装mysql8.0

目录 一、环境及版本介绍 二、安装前准备 三、开始安装 一、环境及版本介绍 Linux环境&#xff1a;Centos7 Mysql版本&#xff1a;8.0.26 安装时使用的用户&#xff1a;root 二、安装前准备 1.1、下载Centos7镜像 网上寻找相关资源即可 1.2、下载VMwareWorkstation Pro并…

56、springboot ------ RESTful服务及RESTful接口设计

★ RESTful服务 RESTful服务是“前后端分离”架构中的主要功能&#xff1a; 后端应用对外暴露RESTful服务&#xff0c;前端应用则通过RESTful服务与后端应用交互。后端应用 RESTful接口 <------------------> 前端★ 基于JSON的RESTful服务 使用RestController注解…

苹果发布会:iPhone15系列

苹果将在北京时间9月13日凌晨1点召开发布会&#xff0c;本次发布会的主角是iPhone 15系列&#xff0c;包含四款机型&#xff1a;iPhone 15、iPhone 15 Plus、iPhone 15 Pro 以及 iPhone 15 Pro Max&#xff0c;本次发布会快科技全程视频直播&#xff0c;有关产品的细节也会在新…

ES线程池设置

一文搞懂ES中的线程池 - 知乎 ES线程池设置-阿里云开发者社区 文章目录 一、简介 二、线程池类型 2.1、fixed 2.2、scaling 2.3、direct 2.4、fixed_auto_queue_size 三、处理器设置 四、查看线程池 4.1、cat thread pool 4.2、nodes info 4.3、nodes stats 4.4、no…

Linux项目自动化构建工具-make/Makefile

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——make/makefile ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;Linux项目自动化构建工具-make/Makefile。 目录 一.背景 二.m…

【操作系统】电脑上没有IIS怎么办

文章目录 前言一、查看二、解决 前言 有的新机刚开始在计算机-管理-服务下没有IIS网络服务怎么办。 一、查看 桌面计算机/此电脑 鼠标右键&#xff1a;管理 服务和应用 发现没有IIS 二、解决 控制面板 程序和功能 启动或关闭Windows功能 IIS相关的所有功能选中&#xff…

leetcode 234. 回文链表

2023.9.5 本题先将链表的节点值移到数组中&#xff0c;再用双指针去判断该数组是否为回文的即可。 代码如下&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* …

入门人工智能 —— 学习 python 使用 IDE :vscode 完成编程 (2)

入门人工智能 —— 学习 python 使用 IDE &#xff1a;vscode 完成编程 &#xff08;2&#xff09; 安装和配置 VSCode创建和运行 Python 代码使用 VSCode 的调试功能 在上一篇文章中&#xff0c;介绍了如何入门人工智能编程&#xff0c;并开始了学习 Python 编程语言的基础知识…

QT—基于http协议的网络文件下载

1.常用到的类 QNetworkAccessManager类用于协调网络操作&#xff0c;负责发送网络请求&#xff0c;创建网络响应 QNetworkReply类表示网络请求的响应。在QNetworkAccessManager发送一个网络请求后创建一个网络响应。它提供了以下信号&#xff1a; finished()&#xff1a;完成…

快速构建基于Paddle Serving部署的Paddle Detection目标检测Docker镜像

快速构建基于Paddle Serving部署的Paddle Detection目标检测Docker镜像 项目介绍需要重点关注的几个文件构建cpu版本的docker构建gpu版本的docker&#xff08;cuda11.2cudnn8&#xff09; 阅读提示&#xff1a; &#xff08;1&#xff09;Paddle的Serving项目中&#xff0c;在t…

kubernetes集群安装详细步骤

kubernetes集群安装详细步骤&#xff08;V1.20.6&#xff09; 本篇主要介绍kubernetes的1.20.6版本集群安装&#xff0c;废话不多说&#xff0c;直接看步骤&#xff1a; 1、安装环境介绍 主机节点&#xff1a; 主机操作系统&#xff1a;Centos7.9 配置&#xff1a; 内存建议…

springboot + vue + elementui — upload解决跨域、实现图片上传

今日记录通过elementui上传时得到的问题。 我们在本地部署的服务,前端服务请求后端接口,存在跨域问题&#xff0c; 1.可以利用springboot解决跨域问题&#xff0c;这里不列举 2.利用vue配置进行反向代理。 vue解决跨域 在vue.config.js文件中配置 const { defineConfig }…

Datax抽取mysql的bit类型数据

背景&#xff1a;使用datax抽取mysql的一张表&#xff0c;里面有两个bit类型的字段&#xff0c;抽取出来显示如下&#xff1a; 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果&#xff1a;

【UE 材质】制作飘动的旗帜

效果 步骤 1. 首先在建模软件中创建一个平面&#xff0c;注意分段数一定要多 2. 在UE中创建一个材质&#xff0c;这里命名为“Mat_Flag” 打开“Mat_Flag”&#xff0c;先将旗帜纹理连接到基础颜色 先选中导入的模型然后点击根据选中的模型预览材质 创建如下节点可以看到此时模…

2023物联网新动向:WEB组态除了用于数据展示,也支持搭建业务逻辑,提供与蓝图连线和NodeRed规则链类似的可视化编程能力

前言 组态编辑在工业控制、物联网场景中十分常见&#xff0c;越来越多的物联网平台也把组态作为一项标配功能。 物联网产业链自下往上由“端 - 边 - 管 - 云 -用”多个环节构成&#xff0c;组态通常是用于搭建数据展示类型的应用&#xff0c;而随着系统集成度越来越高&#x…