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

news2024/11/27 4:35:26

在这里插入图片描述

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

第1题:书架

John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。
John共有N头奶牛(1 ≤ N ≤ 20,000),每头奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N头奶牛的总高度为S。书架高度为B(1 ≤ B ≤ S < 2,000,000,007).
为了到达书架顶层,奶牛可以踩着其他奶牛的背,像叠罗汉一样,直到他们的总高度不低于书架高度。当然若奶牛越多则危险性越大。为了帮助John到达书架顶层,找出使用奶牛数目最少的解决方案吧。
时间限制:10000
内存限制:65536
输入
第1行:空格隔开的整数N和B 第2~N+1行:第i+1行为整数Hi
输出
能达到书架高度所使用奶牛的最少数目
样例输入
6 40
6
18
11
13
19
11
样例输出
3

答案:

#include <stdio.h>
#include <stdlib.h>

#define INF 999999999
#define N 20001

void myQuickSort(int x, int y, int a[]) {
    int i = x, j = y, mid = a[(x + y) / 2];
    while (i <= j) {
        while (a[i] > mid)
            i++;
        while (a[j] < mid)
            j--;
        if (i <= j) {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            i++;
            j--;
        }
    }
    if (x < j)
        myQuickSort(x, j, a);
    if (i < y)
        myQuickSort(i, y, a);
}

int main() {
    int n, b;
    int sum = 0;
    int i;
    scanf("%d %d", &n, &b);
    int *a = (int*)malloc((N + 1) * sizeof(int));
    for (i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    myQuickSort(1, n, a);
    for (i = 1; i <= n; i++) {
        sum += a[i];
        if (sum >= b)
            break;
    }
    printf("%d\n", i);
    free(a);
    return 0;
}

这段代码是一个使用快速排序算法来解决问题的示例。下面是对代码的解析:

  1. 首先,我们包含了所需的标准库头文件 <stdio.h><stdlib.h>,用于输入输出和内存管理。

  2. 定义了常量 INFN,分别表示一个较大的无穷大值和数组 a 的最大长度。

  3. 声明了自定义的快速排序函数 myQuickSort,它接受数组的起始和结束索引,以及数组本身作为参数。该函数使用分治法对数组进行原地排序。

  4. 主函数 main 开始执行。

  5. 在主函数中,声明了变量 nb,用于存储输入的整数值。变量 sum 用于计算数组元素的累加和,变量 i 用于循环迭代。

  6. 使用 scanf 函数依次读取输入的整数值 nb

  7. 动态分配内存,创建一个大小为 (N + 1) 的整型数组 a,用于存储输入的数组元素。这里使用 malloc 函数来分配内存。

  8. 使用 for 循环,从 1n 依次读取输入的数组元素,并将其存储在数组 a 中。

  9. 调用 myQuickSort 函数,传入 1n 作为数组的起始和结束索引,以及数组 a 本身。这将对数组 a 进行原地排序。

  10. 使用 for 循环遍历数组 a,计算累加和并检查是否达到或超过 b。一旦达到条件,跳出循环。

  11. 使用 printf 函数输出最终的计数器 i 的值,即第一个使得累加和大于等于 b 的位置。

  12. 最后,使用 free 函数释放动态分配的内存,即数组 a 所占用的内存。

这段代码的核心是快速排序算法,它通过递归地将数组划分为较小的子数组,并对子数组进行排序,最终实现整个数组的排序。然后,通过累加数组元素并检查累加和来确定满足条件的位置。这个示例展示了如何使用快速排序算法解决一个具体的问题。

第2题:抓牛

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
时间限制:2000
内存限制:65536
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4

以下是使用搜索剪枝技术来解决抓牛问题的C语言代码:

#include <stdio.h>

#define MAX_N 100000

int minTime = MAX_N + 1;  // 最小花费时间

void dfs(int N, int K, int time) {
    // 剪枝条件:当时间已经超过最小花费时间或者超出范围时,停止搜索
    if (time >= minTime || N > MAX_N || N < 0) {
        return;
    }
    
    // 如果农夫抓住了牛,更新最小花费时间
    if (N == K) {
        if (time < minTime) {
            minTime = time;
        }
        return;
    }
    
    // 递归搜索两种移动方式
    dfs(N - 1, K, time + 1);  // 从X移动到X-1
    dfs(N + 1, K, time + 1);  // 从X移动到X+1
    dfs(N * 2, K, time + 1);  // 从X移动到2*X
}

int main() {
    int N, K;
    
    // 读取输入
    scanf("%d %d", &N, &K);
    
    // 深度优先搜索
    dfs(N, K, 0);
    
    // 输出结果
    printf("%d\n", minTime);
    
    return 0;
}

该算法使用深度优先搜索的方法来搜索所有可能的移动路径,同时利用剪枝技术来提前终止搜索。在搜索过程中,维护一个最小花费时间的变量,如果当前时间超过最小花费时间或者农夫的位置超出范围,则停止搜索该路径。如果农夫抓住了牛,则更新最小花费时间。最后,输出最小花费时间作为解。

第3题:鸣人和佐助

佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?
已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?
输入
输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。
输出
输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。
样例输入1
4 4 1
#@##
**##
###+
****
样例输入2
4 4 2
#@##
**##
###+
****
样例输出1
6
样例输出2
4

答案:

#include <stdio.h>
#include <string.h>

#define INF 0x3f3f3f3f
#define MAX_N 201
#define MAX_M 201
#define MAX_T 11

int n, m, sx, sy, st, minstep = INF;
int step[MAX_N][MAX_M][MAX_T];
int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};
char mp[MAX_N][MAX_M];
int vis[MAX_N][MAX_M];

void dfs(int x, int y, int t, int stp) {
    // 边界条件判断
    if (x < 1 || x > n || y < 1 || y > m || vis[x][y]) return;
    if (t < 0) return;
    if (stp >= minstep) return;
    if (stp >= step[x][y][t]) return;
    step[x][y][t] = stp;

    // 处理当前位置的情况
    if (mp[x][y] == '#') t--;
    else if (mp[x][y] == '+') {
        if (stp < minstep) minstep = stp;
        return;
    }

    // 标记当前位置已访问
    vis[x][y] = 1;

    // 递归尝试四个方向的移动
    for (int i = 0; i < 4; ++i) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        dfs(nx, ny, t, stp + 1);
    }

    // 回溯,取消当前位置的访问标记
    vis[x][y] = 0;
}

int main() {
    // 读取输入
    scanf("%d%d%d", &n, &m, &st);
    getchar();
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            scanf("%c", &mp[i][j]);
            if (mp[i][j] == '@') {
                sx = i;
                sy = j;
            }
        }
        getchar();
    }

    // 初始化步数数组
    memset(step, 0x3f, sizeof(step));

    // 深度优先搜索
    dfs(sx, sy, st, 0);

    // 输出结果
    if (minstep == INF) printf("-1");
    else printf("%d", minstep);

    return 0;
}

这段代码使用深度优先搜索(DFS)来解决问题。我们首先定义了常量INF表示无穷大的步数,并定义了地图的最大大小MAX_NMAX_M,以及最大的查克拉数量MAX_T

然后,我们定义了一些全局变量,包括地图的行数和列数nm、起点的坐标sxsy、起始的查克拉数量st,以及最小步数minstep和步数数组step

接下来,我们定义了方向数组dxdy,表示上下左右四个方向的偏移量。我们还定义了地图的字符数组mp和访问标记数组vis

dfs函数中,我们首先进行边界条件的判断,如果当前位置超出地图范围或已经访问过,则返回。如果查克拉数量小于0,则返回。如果当前步数大于等于最小步数,则返回。如果当前步数大于等于记录的步数数组中的步数,则返回。

然后,我们更新步数数组中当前位置和查克拉数量的步数值。接着,根据当前位置的情况进行处理:如果是墙壁,则查克拉数量减1;如果是佐助,则更新最小步数并返回。

接下来,我们标记当前位置为已访问,并尝试四个方向的移动,进行递归调用。每次递归调用时,我们更新新位置的坐标nxny,并将查克拉数量和步数加1。递归调用结束后,我们回溯,取消当前位置的访问标记。

main函数中,我们首先读取输入的地图大小和起始查克拉数量。然后,我们使用双重循环读取地图的每个字符,并记录起点的坐标。

接下来,我们使用memset函数将步数数组初始化为一个较大的数值,表示未访问过的状态。

最后,我们调用dfs函数进行深度优先搜索,并输出最小步数结果。

如果最小步数minstep的值为INF,则说明无法到达佐助的位置,输出"-1"。否则,输出最小步数的值。

请注意,这段代码假设输入的地图是合法的,并且起点和终点都存在。如果输入的地图不满足这些条件,代码可能会出现问题。另外,代码中使用的是递归的深度优先搜索方法,对于较大的地图和查克拉数量可能会导致栈溢出的问题。在实际应用中,可能需要进行优化或使用其他搜索算法来解决这个问题。

第4题:献给阿尔吉侬的花束

阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。
迷宫用一个R×C的字符矩阵来表示。字符S表示阿尔吉侬所在的位置,字符E表示奶酪所在的位置,字符#表示墙壁,字符.表示可以通行。阿尔吉侬在1个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。
时间限制:100
内存限制:65536
输入
第一行是一个正整数T(1 <= T <= 10),表示一共有T组数据。 每一组数据的第一行包含了两个用空格分开的正整数R和C(2 <= R, C <= 200),表示地图是一个R×C的矩阵。 接下来的R行描述了地图的具体内容,每一行包含了C个字符。字符含义如题目描述中所述。保证有且仅有一个S和E。
输出
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。每组数据的输出结果占一行。
样例输入
3
3 4
.S…
###.
…E.
3 4
.S…
.E…

3 4
.S…
####
…E.
样例输出
5
1
oop!

答案:
以下是使用C语言编写的解决方案:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX_R 202
#define MAX_C 202

char maze[MAX_R][MAX_C];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

struct Node {
    int x, y, step;
};
struct Node queue[MAX_R * MAX_C];
int front, rear;

int bfs(int r, int c) {
    int i, j, k;
    int mi, mj;
    int tx, ty;
    bool is_t = false;

    for (i = 1; i <= r; i++) {
        for (j = 1; j <= c; j++) {
            if (maze[i][j] == 'S') {
                mi = i;
                mj = j;
            }
        }
    }

    front = rear = 0;
    queue[rear].x = mi;
    queue[rear].y = mj;
    queue[rear].step = 0;
    rear++;

    while (front < rear) {
        struct Node t = queue[front++];
        for (k = 0; k < 4; k++) {
            tx = t.x + dx[k];
            ty = t.y + dy[k];
            if (tx < 1 || tx > r || ty < 1 || ty > c)
                continue;
            else if (maze[tx][ty] == '#')
                continue;
            else if (maze[tx][ty] == 'E') {
                is_t = true;
                return t.step + 1;
            } else if (maze[tx][ty] == '.') {
                queue[rear].x = tx;
                queue[rear].y = ty;
                queue[rear].step = t.step + 1;
                rear++;
                maze[tx][ty] = '#';
            }
        }
    }

    if (!is_t)
        return -1;
}

int main() {
    int t, r, c;
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &r, &c);
        memset(maze, 0, sizeof(maze));
        for (int i = 1; i <= r; i++) {
            scanf("%s", &maze[i][1]);
        }
        int result = bfs(r, c);
        if (result == -1)
            printf("oop!\n");
        else
            printf("%d\n", result);
    }
    return 0;
}

该解决方案使用广度优先搜索(BFS)算法来找到阿尔吉侬到达奶酪的最短路径。在BFS过程中,使用队列来保存待处理的节点,并逐步扩展到相邻的可通行节点,直到找到奶酪或无法到达。

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

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

相关文章

智能安全帽定制_基于联发科MT6762平台的智能安全帽方案

智能安全帽是一种具备多项功能的高科技产品&#xff0c;其功能集成了视频通话监控、高清图像采集、无线数据传输、语音广播对讲、定位轨迹回放、静默报警、危险救援报警、脱帽报警、碰撞报警、近电报警以及智能调度系统等&#xff0c;同时还支持多功能模块的自由添加&#xff0…

7. UE5 RPG修改GAS的Attribute的值

前面几节文章介绍了如何在角色身上添加AbilitySystemComponent和AttributeSet。并且还实现了给AttributeSet添加自定义属性。接下来&#xff0c;实现一下如何去修改角色身上的Attribute的值。 实现拾取药瓶回血功能 首先创建一个继承于Actor的c类&#xff0c;actor是可以放置到…

银河麒麟操作系统 v10 中离线安装 Docker

银河麒麟操作系统 v10 中离线安装 Docker 1. 查看系统版本2. 查看 Linux 内核版本&#xff08;3.10以上&#xff09;3. 查看 iptabls 版本&#xff08;1.4以上&#xff09;4. 判断处理器架构5. 离线下载 Docker 安装包6. 移动解压出来的二进制文件到 /usr/bin 目录中7. 配置 Do…

课表排课小程序怎么制作?多少钱?

在当今的数字化时代&#xff0c;无论是购物、支付、点餐&#xff0c;还是工作、学习&#xff0c;都离不开各种各样的微信小程序。其中&#xff0c;课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢&#xff1f;又需要多少钱呢&#xff1f; …

网络端口映射和端口转发的区别和联系

目 录 一、端口映射技术 1.1 原理 1.2 应用场景 1、远程访问 2、游戏主机 3、文件共享 4、监控视频共享 二、端口转发技术 2.1 原理 2.2 应用场景 1、网络负载均衡 2、网络安全 3、网络代理 三、端口映射和转发的实现方法 3.1 路由器配置 3.2 网络防火墙 …

操作系统课程设计-Linux 进程间通信

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 步骤 3.2 关键代码 3.2.1 Server和Client的创建 3.2.2 Server核心代码 3.2.3 Server核心代码 4 实验结果与分析 5 代码 前言 本实验为课设内容&#xff0c;博客内容为部分报告内容&#xff0c;仅为大家提供参考&…

如何用Python进行数据分析(保姆级教程)

有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了&#xff0c;比较复杂。 很多网上的资料都是从语法教起的&#xff0c;花了很多时间还是云里雾里&#xff0c;摸不清方向。今天就给大家来捋一捋思路&#xff01;帮助大家提高学习效率&#xff01; Pyt…

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…

【Mybatis】延迟加载的原理是什么?

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 ​ 目录 前言 正文 MyBatis实现延迟加载的步骤&#xff1a; 生成代理对象&#xff1a; 触发时机&#xff1a; 执行查询&#xff1a; 填…

《169. 多数元素》C语言题解(力扣)(OJ题)

题目链接&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 个人力扣题解主页&#xff1a;我的题解…

K8s-架构

一、K8s节点划分 K8s集群包含Master(控制节点)和Node(工作节点)&#xff0c;应用部署在Node节点上。 集群架构图&#xff1a; 二、Master节点 Master节点分成四个组件&#xff1a;scheduler、ApiServer、Controller Manager、ETCD。类似三层结构&#xff0c;controller&#…

[自动化分布式] Zabbix自动发现与自动注册

abbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大 部署 添加zabb…

Firefox 100 正式发布

五月三日&#xff0c;Firefox发布了它的第100个版本&#xff0c;来回顾一下Firefox是如何走到今天这一步的&#xff0c;以及在第100个版本中发布了哪些功能。 回顾 2004年&#xff0c;《纽约时报》上宣布了Firefox 1.0的发布&#xff0c;这个广告列出了为第一版做出贡献的每一…

【MATLAB源码-第115期】基于matlab的QSM正交空间调制系统仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交空间调制&#xff08;QSM&#xff09;是一种先进的无线通信技术&#xff0c;它通过利用发射端的多天线阵列来传输信息&#xff0c;从而提高了数据传输的效率和速率。这种技术的关键在于它使用天线阵列的空间特性来编码额…

机器学习笔记——机器学习的分类

1 机器学习是啥 机器学习是人工智能的一个分支&#xff0c;它是一门研究机器获取新知识和新技能&#xff0c;并识别现有知识的学问。 机器学习已广泛应用于数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA 序列测…

交换机配置及网络测试

实验环境 拓扑图 Ip规划表 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-254 12 财务部 9 192.168.133.0 255.255.255…

Chatopera 云服务支持大语言模型对话(LLM),定制您的聊天机器人

2024 年&#xff0c;Chatopera 云服务继续不断完善&#xff0c;为开发者提供最好的定制聊天机器人的工具。在过去的一年&#xff0c;用户们反映最多的建议是 Chatopera 云服务内置大语言模型的对话&#xff0c;今天 Chatopera 云服务完成了产品升级&#xff0c;满足了这个诉求。…

NOIP2018提高组day2 - T1:旅行

题目链接 [NOIP2018 提高组] 旅行 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国&#xff0c;打算将各个城市都玩一遍。 小 Y 了解到&#xff0c;X 国的 n n n 个城市之间有 m m m 条双向道路。每条双向道路连接两个城市。 不存在两条连接同一对城市的道路&#xff…

跨站点请求伪造攻击 - Cross Site Request Forgery (CSRF)

什么是CSRF 最好理解CSRF攻击的方式是看一个具体的例子。 假设你的银行网站提供一个表单,允许当前登录用户将钱转账到另一个银行账户。例如,转账表单可能如下所示: <form method="post"action="/transfer"> <

【深度强化学习】目前落地的挑战与前沿对策

到目前为止&#xff0c;深度强化学习最成功、最有名的应用仍然是 Atari 游戏、围棋游戏等。即使深度强化学习有很多现实中的应用&#xff0c;但其中成功的应用并不多。为什么呢&#xff1f;本文总结目前的挑战。 目录 所需的样本数量太大探索阶段代价太大超参数的影响非常大稳定…