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

在这里插入图片描述

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

第1题:有多少种二叉树

输入n(1<n<13),求n个结点的二叉树有多少种形态
时间限制:1000
内存限制:65536
输入
整数n
输出
答案
样例输入
3
样例输出
5

这个问题可以使用动态规划的方法来解决。我们可以定义一个数组dp,其中dp[i]表示有i个节点时的二叉树的种数。根据二叉树的性质,我们可以知道一个二叉树的种数取决于其左子树和右子树的种数。

具体的动态规划递推关系如下:

对于i个节点的二叉树,我们可以选择一个节点作为根节点,将其左边的节点构成左子树,右边的节点构成右子树。根据这个划分,可以得到以下关系:

dp[i] = dp[0] * dp[i-1] + dp[1] * dp[i-2] + ... + dp[i-1] * dp[0]

其中,dp[j]表示有j个节点构成的二叉树的种数。

根据上述递推关系,我们可以通过动态规划的方式计算出dp[n],即有n个节点的二叉树的种数。

下面是使用C语言实现的代码:

#include <stdio.h>long long int countBinaryTrees(int n) {long long int dp[n + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = 0;for (int j = 0; j < i; j++) {dp[i] += dp[j] * dp[i - j - 1];}}return dp[n];
}int main() {int n;scanf("%d", &n);long long int result = countBinaryTrees(n);printf("%lld\n", result);return 0;
}

该代码中使用了一个数组dp来保存中间结果,避免重复计算。时间复杂度为O(n^2),空间复杂度为O(n)。请注意,由于给定的n的范围较小,因此使用整型变量和long long int类型即可满足要求。如果需要支持更大范围的n,可以考虑使用高精度整数库。

第2题:城堡问题

1 2 3 4 5 6 7
#############################
1 # | # | # | | #
#####—#####—#—#####—#
2 # # | # # # # #
#—#####—#####—#####—#
3 # | | # # # # #
#—#########—#####—#—#
4 # # | | | | # #
#############################
(图 1)
# = Wall
| = No wall
- = No wall
图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成m×n(m≤50,n≤50)个方块,每个方块可以有0~4面墙。
时间限制:1000
内存限制:65536
输入
程序从标准输入设备读入数据。第1、2行每行1个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证城堡至少有两个房间。
输出
输出2行,每行一个数,表示城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。
样例输入
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
样例输出
5
9

这个问题可以使用深度优先搜索(DFS)算法来解决。我们可以遍历城堡的每个房间,对于每个未访问过的房间,进行深度优先搜索,统计房间的数量和最大房间的大小。

具体的算法步骤如下:

  1. 定义一个二维数组visited用于记录房间的访问状态,初始化为0。

  2. 定义变量roomCount用于记录房间数量,初始化为0。

  3. 定义变量maxRoomSize用于记录最大房间的大小,初始化为0。

  4. 对于城堡的每个房间,如果该房间未被访问过,则进行深度优先搜索:

  • 将当前房间标记为已访问(设置visited数组对应位置为1)。

  • 增加roomCount的值。

  • 计算当前房间的大小,即从当前房间开始的连通区域的大小,使用递归实现:

    • 统计当前房间的大小,并更新maxRoomSize的值。

    • 对当前房间的四个方向进行判断,如果该方向没有墙且相邻房间未被访问过,则继续递归搜索该相邻房间。

  1. 输出roomCountmaxRoomSize的值。

下面是使用C语言实现的代码:

#include <stdio.h>#define MAX_SIZE 50int castle[MAX_SIZE][MAX_SIZE];
int visited[MAX_SIZE][MAX_SIZE];int dfs(int row, int col) {if (visited[row][col])return 0;visited[row][col] = 1;int size = 1;if (castle[row][col] % 2 == 0)  // 没有西墙size += dfs(row, col - 1);if (castle[row][col] % 4 >= 2)  // 没有北墙size += dfs(row - 1, col);if (castle[row][col] % 8 >= 4)  // 没有东墙size += dfs(row, col + 1);if (castle[row][col] >= 8)      // 没有南墙size += dfs(row + 1, col);return size;
}void findLargestRoom(int m, int n, int* roomCount, int* maxRoomSize) {*roomCount = 0;*maxRoomSize = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {visited[i][j] = 0;}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!visited[i][j]) {(*roomCount)++;int size = dfs(i, j);if (size > *maxRoomSize)*maxRoomSize = size;}}}
}int main() {int m, n;scanf("%d%d", &m, &n);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {scanf("%d", &castle[i][j]);}}int roomCount, maxRoomSize;findLargestRoom(m, n, &roomCount, &maxRoomSize);printf("%d\n%d\n", roomCount, maxRoomSize);return 0;
}

该代码中,castle数组表示城堡的地形图,visited数组用于记录房间的访问状态。dfs函数实现了深度优先搜索,计算从某个房间开始的连通区域的大小。findLargestRoom函数遍历城堡的每个房间,对于每个未访问过的房间进行深度优先搜索,统计房间的数量和最大房间的大小。最后,输出房间数量和最大房间的大小。

该代码的时间复杂度为O(mn),其中m和n分别是城堡的南北向和东西向方块数。空间复杂度为O(mn),用于存储visited数组。请注意,题目给定的城堡大小范围较小,因此使用二维数组存储数据是可行的。如果需要支持更大范围的城堡,可以考虑使用动态分配的二维数组或其他数据结构来存储数据。

第3题:快速堆猪

小明有很多猪,他喜欢玩叠猪游戏,就是将猪一头头叠起来。猪叠上去后,还可以把顶上的猪拿下来。小明知道每头猪的重量,而且他还随时想知道叠在那里的猪最轻的是多少斤。
时间限制:1000
内存限制:65536
输入
有三种输入 1)push n n是整数(0<=0 <=20000),表示叠上一头重量是n斤的新猪 2)pop 表示将猪堆顶的猪赶走。如果猪堆没猪,就啥也不干 3)min 表示问现在猪堆里最轻的猪多重。如果猪堆没猪,就啥也不干 输入总数不超过100000条
输出
对每个min输入,输出答案。如果猪堆没猪,就啥也不干
样例输入
pop
min
push 5
push 2
push 3
min
push 4
min
样例输出
2
2

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

#include <stdio.h>
#include <stdlib.h>typedef struct {int weight;struct Node* next;
} Node;Node* stack = NULL;
int minWeight = -1;void push(int weight) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->weight = weight;newNode->next = stack;stack = newNode;if (minWeight == -1 || weight < minWeight) {minWeight = weight;}
}void pop() {if (stack == NULL) {return;}Node* top = stack;stack = stack->next;free(top);if (stack == NULL) {minWeight = -1;}
}int getMinWeight() {return minWeight;
}int main() {char command[10];int weight;while (scanf("%s", command) != EOF) {if (strcmp(command, "push") == 0) {scanf("%d", &weight);push(weight);} else if (strcmp(command, "pop") == 0) {pop();} else if (strcmp(command, "min") == 0) {int min = getMinWeight();if (min != -1) {printf("%d\n", min);}}}return 0;
}

这段代码使用堆栈(stack)数据结构来实现叠猪游戏。每个猪的重量被存储在一个链表节点(Node)中,而链表的头部代表猪堆的顶部。初始时,堆栈为空,最轻的猪的重量为-1。

程序逐行读取输入,根据命令执行相应的操作。当输入是"push n"时,程序将创建一个新的节点,并将其压入堆栈。如果新节点的重量小于当前最轻的猪的重量(或堆栈为空),则更新最轻猪的重量。当输入是"pop"时,程序将从堆栈中弹出一个节点(如果堆栈不为空)。如果堆栈为空,最轻猪的重量将被重置为-1。当输入是"min"时,程序将输出当前最轻的猪的重量(如果堆栈不为空)。

请注意,此代码假定输入是有效的,并且不会超出内存限制。你可以根据需要对其进行修改和扩展。

第4题:重建二叉树

给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。
时间限制:1000
内存限制:65536
输入
输入可能有多组,以EOF结束。 每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。
输出
对于每组输入,用一行来输出它后序遍历结果。
样例输入
DBACEGF ABCDEFG
BCAD CBAD
样例输出
ACBFGED
CDAB

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct Node {char value;struct Node* left;struct Node* right;
} Node;Node* buildTree(char* preorder, char* inorder, int preStart, int preEnd, int inStart, int inEnd) {if (preStart > preEnd || inStart > inEnd) {return NULL;}char rootValue = preorder[preStart];int rootIndex = 0;for (int i = inStart; i <= inEnd; i++) {if (inorder[i] == rootValue) {rootIndex = i;break;}}int leftSize = rootIndex - inStart;Node* root = (Node*)malloc(sizeof(Node));root->value = rootValue;root->left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, rootIndex - 1);root->right = buildTree(preorder, inorder, preStart + leftSize + 1, preEnd, rootIndex + 1, inEnd);return root;
}void postorderTraversal(Node* root) {if (root == NULL) {return;}postorderTraversal(root->left);postorderTraversal(root->right);printf("%c", root->value);
}int main() {char preorder[100];char inorder[100];while (scanf("%s %s", preorder, inorder) != EOF) {int preLength = strlen(preorder);int inLength = strlen(inorder);Node* root = buildTree(preorder, inorder, 0, preLength - 1, 0, inLength - 1);postorderTraversal(root);printf("\n");free(root);}return 0;
}

这段代码实现了根据前序遍历和中序遍历结果重建二叉树,并输出后序遍历结果。

程序逐行读取输入的前序遍历和中序遍历结果,并调用buildTree函数构建二叉树。buildTree函数根据当前的前序遍历序列、中序遍历序列以及其在序列中的起始和结束位置进行递归构建。在每次递归中,找到当前根节点的值,然后通过在中序遍历序列中找到根节点的位置,将序列分为左子树和右子树。然后,递归地构建左子树和右子树,并将它们连接到当前根节点上。

构建完二叉树后,调用postorderTraversal函数进行后序遍历,并输出结果。postorderTraversal函数使用递归方式进行后序遍历,先遍历左子树,再遍历右子树,最后输出当前节点的值。

请注意,此代码假定输入是有效的,并且不会超出内存限制。你可以根据需要对其进行修改和扩展。

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

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

相关文章

IDEA复制一个工程为多个并启动,测试负载均衡

1 找到服务按钮 2 选择复制配置 3 更改新的名称与虚拟机参数 复制下面的代码在VM参数中 -Dserver.port8082 4 最后启动即可

Vue框架--Vue中el和data的两种写法

data与el的2种写法 1.el有2种写法 (1).new Vue时候配置el属性。 (2).先创建Vue实例&#xff0c;随后再通过vm.$mount(#root)指定el的值。 2.data有2种写法 (1).对象式 (2).函数式 如何选择&#xff1a;目前哪种写法都可以&#xff0c;以后学习到组件时&#xff…

解决 filezilla 连接服务器失败问题

问题描述&#xff1a; 开始一直用的 XFTP 后来&#xff0c;它变成收费软件了&#xff0c;所以使用filezilla 代替 XFTP 之前用的还好好的&#xff0c;今天突然就报错了&#xff1a;按要求输入相关字段&#xff0c;连接 连接失败&#xff01;&#xff01;&#xff01;o(╥﹏╥…

预推免,保研------长安大学保内,附加分面试准备【记录帖】

&#x1f680;长安大学——人工智能系——程惠泽 &#x1f68c;前六学期专业排名&#xff1a;7/82 &#x1f68c;信息门户GPA&#xff1a;3.94 &#x1f68c;平均成绩&#xff1a;89.83 &#x1f68c;加权成绩&#xff1a;89.15 / ☁️本人比较菜&#xff0c;只能保研本校&…

Aqs的CyclicBarrier。

今天我们来学习AQS家族的“外门弟子”&#xff1a;CyclicBarrier。 为什么说CyclicBarrier是AQS家族的“外门弟子”呢&#xff1f;那是因为CyclicBarrier自身和内部类Generation并没有继承AQS&#xff0c;但在源码的实现中却深度依赖AQS家族的成员ReentrantLock。就像修仙小说…

C++实现蜂群涌现效果(flocking)

Flocking算法0704_元宇宙中的程序员的博客-CSDN博客 每个个体的位置&#xff0c;通过计算与周围个体的速度、角度、位置&#xff0c;去更新位置。

【Seata】00 - Seata Server 部署(Windows、Docker 基于 Jpom)

文章目录 前言参考目录版本说明Windows 部署 seata-server1&#xff1a;下载压缩包2&#xff1a;文件存储模式3&#xff1a;db 存储模式3.1&#xff1a;建表3.2&#xff1a;修改配置文件3.3&#xff1a;启动脚本4&#xff1a;源码部署 Docker 部署 seata-server &#xff08;基…

Java学习之序列化

1、引言 《手册》第 9 页 “OOP 规约” 部分有一段关于序列化的约定 1&#xff1a; 【强制】当序列化类新增属性时&#xff0c;请不要修改 serialVersionUID 字段&#xff0c;以避免反序列失败&#xff1b;如果完全不兼容升级&#xff0c;避免反序列化混乱&#xff0c;那么请…

引用(个人学习笔记黑马学习)

1、引用的基本语法 #include <iostream> using namespace std;int main() {int a 10;//创建引用int& b a;cout << "a " << a << endl;cout << "b " << b << endl;b 100;cout << "a "…

JVM 是怎么设计来保证new对象的线程安全

1、采用 CAS 分配重试的方式来保证更新操作的原子性 2、每个线程在 Java 堆中预先分配一小块内存&#xff0c;也就是本地线程分配缓冲&#xff08;Thread Local AllocationBuffer&#xff0c;TLAB&#xff09;&#xff0c;要分配内存的线程&#xff0c;先在本地缓冲区中分配&a…

LeetCode494. 目标和

494. 目标和 文章目录 [494. 目标和](https://leetcode.cn/problems/target-sum/)一、题目二、题解方法一&#xff1a;目标和路径计数算法方法二&#xff1a;01背包方法三&#xff1a;01背包一维数组 一、题目 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个…

外部中断(EXTI) - 按键控制LED

一、外部中断/事件控制器(EXTI)结构图 1、结构图分析 外部中断主要由外部中断/事件控制器(External interrupt/event controller, EXTI)控制&#xff0c;它管理了外部中断或者事件的使能与否、触发方式等功能。 &#xff08; 外部中断/事件控制器(EXTI)结构图 &#xff09; …

【5】openGL使用宏和函数进行错误检测

当我们编写openGL程序&#xff0c;没有报编译链接错误&#xff0c;但是运行结果是黑屏&#xff0c;这不是我们想要的。 openGL提供了glGetError 来检查错误&#xff0c;我们可以通过在运行时进行打断点查看glGetError返回值&#xff0c;得到的是一个十进制数&#xff0c;将其转…

Nacos服务注册和服务配置

Nacos 是什么 Nacos (Dynamic Naming and Configuration Service)&#xff0c;其命名由三部分组成&#xff1a; Na (naming/nameServer)&#xff0c;即服务注册中心。 co (configuration)&#xff0c;即配置中心。 s (service)&#xff0c;即服务&#xff0c;表示 Nacos 实现的…

华为 连接OSPF和RIP网络---OSPF和RIP网络相互引入

路由引入简介 不同路由协议之间不能直接共享各自的路由信息&#xff0c;需要依靠配置路由的引入来实现。 获得路由信息一般有3种途径&#xff1a;直连网段、静态配置和路由协议。可以将通过这3种途径获得的路由信息引入到路由协议中&#xff0c;例如&#xff0c;把直连网段引入…

【文心一言】学习笔记

学习资料 《听说文心一言App霸榜了&#xff0c;那必须来一波全方位实测了》 情感陪伴&#xff1a;文心一言 App 可以充当用户的情感树洞&#xff0c;提供知心姐姐、【暖男】等角色扮演&#xff0c;为用户提供情绪疏导、情感分析、约会建议等服务。 1. 模型属性 【提示词工具…

无涯教程-Android - CheckBox函数

CheckBox是可以由用户切换的on/off开关。为用户提供一组互不排斥的可选选项时,应使用复选框。 CheckBox 复选框属性 以下是与CheckBox控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关方法。 继承自 android.widget.T…

nuxt3+ts+vue3的ssr项目总结

目录 一、什么是SSR、SEO、SPA&#xff0c;它们之间的关系又是怎样的。 二、VUE做SSR的几种方法 1、插件prerender-spa-plugin 2、VUE开启SSR渲染模式 3、使用NUXT框架 三、NUXT3VUE3TS &#xff08;一&#xff09;基本配置 1、文件夹介绍 assets components pages…

Docker安装MySQL教程

虽然 docker 安装 mysql 不是一个很好的方案&#xff0c;但是为了个人使用方便&#xff0c;使用 docker 安装 mysql 还是没什么问题的。 本文为了方便&#xff0c;我们直接通过yum方式安装。所以&#xff0c;我们在安装之前需要电脑可以联网&#xff0c;不然我们这种方式是安装…

Python的由来和基础语法(一)

目录 一、Python 背景知识 1.1Python 是咋来的? 1.2Python 都能干啥? 1.3Python 的优缺点 二、基础语法 2.1常量和表达式 2.2变量和类型 变量的语法 (1) 定义变量 (2) 使用变量 变量的类型 (1) 整数 (2) 浮点数(小数) (3) 字符串 (4) 布尔 (5) 其他 动态类型…