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

news2024/11/27 6:19:32

在这里插入图片描述

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 50

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

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

相关文章

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

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

记录错误:Access denied for user ‘root‘@‘localhost‘ (using password:No) 解决方案

他说我没输入密码&#xff0c;但是我输入了啊&#xff1f;&#xff1f;于是&#xff0c;我试了试这儿&#xff0c;password 一改就好了。。。 他原来是是我打的很快&#xff0c;快速生成的。。。。

ESP32之LEDC(PWM信号的输出)

一、PWM信号简介 PWM&#xff1a;脉冲宽度调制&#xff0c;简称脉宽调制频率(f)&#xff1a;一秒钟PWM有多少个周期(单位Hz)周期(T)&#xff1a;一个周期的时间占空比(duty)&#xff1a;在一个脉冲周期内&#xff0c;高电平的时间与整个周期时间的比例脉宽时间&#xff1a;一个…

React 中的 ref 如何操作 dom节点,使输入框获取焦点

聚焦文字输入框 .focus() 获取焦点 当用户点击按钮时&#xff0c;handleClick 函数会被调用&#xff0c;从而将焦点聚焦到文本输入框上。 // 焦文字输入框 import { useRef } from "react";const FocusForm () > {const inputRef useRef<any>(null);func…

C到C++的升级

C和C的关系 C继承了所有C语言的特性&#xff1b;C在C的基础上提供了更多的语法和特性&#xff0c;C语言去除了一些C语言的不好的特性。C的设计目标是运行效率与开发效率的统一。 变化一&#xff1a;所有变量都可以在使用时定义 C中更强调语言的实用性&#xff0c;所有的变量…

内网隧道代理技术(二十二)之 CS针对特定端口上线不出网机器

CS工具自带上线不出网机器 如图A区域存在一台中转机器,这台机器可以出网,这种是最常见的情况。我们在渗透测试的过程中经常是拿下一台边缘机器,其有多块网卡,边缘机器可以访问内网机器,内网机器都不出网。这种情况下拿这个边缘机器做中转,就可以使用CS工具自带上线不出网…

代码随想录Day_53打卡

①、最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

Flutter状态管理 — 探索Flutter中的状态

前言 随着响应式编程的理念&Flutter被大众所了解以来&#xff0c;状态管理一直是一个引人深思的话题。如果想要学习好Flutter这样的响应式的编程框架就一定是离不开状态管理的。我遇到过很多没有了解过响应式编程框架的&#xff0c;或者从事后端开发&#xff0c;自己想用F…

jmeter While控制器

一种常见的循环控制语句&#xff0c;用于重复执行一段代码块&#xff0c;直到指定的条件不再满足。 参数&#xff1a; 空LASTJMeter变量、函数、属性或任意其他可用表达式 &#xff08;jmeter提供的方法&#xff09;。判断变量值count_num小于等于20&#xff0c;推荐简单的几…

Python入门教程 | Python3 元组(tuple)

创建元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号 ( )&#xff0c;列表使用方括号 [ ]。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 >>> tup1 (Google, Tarzan, 1997, …

组相联cache如何快速实现cache line eviction并使用PMU events验证

如何快速实现cache line eviction 一&#xff0c;什么是cache hit、miss、linefill、evict &#xff1f;1.1 如果要程序员分别制造出cache hit、miss、linefill、evict这四种场景&#xff0c;该怎么做&#xff1f; 二&#xff0c;实现cache line eviction的方法1.1 直接填充法3…

STM32WB55开发(1)----监测STM32WB连接状态

STM32WB55开发----1.监测STM32WB连接状态 概述硬件准备视频教学样品申请选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_App_Notification结果演示 概述 STM32WB系列…

useRef 定义的 ref 在控制台可以打印但是页面不生效?

useRef 是一个 React Hook&#xff0c;它能让你引用一个不需要渲染的值。 点击计时器 点击按钮后在控制台可以打印但是页面不生效。 useRef 返回的值在函数组件中不会自动触发重新渲染&#xff0c;所以控制台可以显示变化而按钮上无法显示 ref.current的变化。 import { use…

ConcurrentHashMap集合

什么是ConcurrentHashMap&#xff1f; ConcurrentHashMap 和HashMap一样&#xff0c;是一个存放键值对的容器。使用Hash算法来获取值的地址&#xff0c;因此时间复杂度是O(1)。查询非常快。ConcurrentHashMap 同时也是线程安全版的HashMap&#xff0c;可以实现线程安全的集合的…

文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

文献阅读&#xff1a;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 1. 文章简介2. 具体方法3. 实验结果 1. 数学推理 1. 实验设计2. 实验结果3. 消解实验4. 鲁棒性考察 2. 常识推理 1. 实验设计2. 实验结果 3. 符号推理 1. 实验设计2. 实验结果 4.…

融合MMEdu和Transformers技术的视障出行智能辅助系统(上海浦育AI未来夏令营结题论文)

融合MMEdu和Transformers技术的视障出行智能辅助系统 摘要 面对社会生活中众多视障者对出行的需求&#xff0c;视障出行智能辅助系统融合MMEdu和Transformers技术为视障者提供实时路况分析。本系统利用图像分类、目标检测和深度估计等软件技术&#xff0c;对摄像头实时获取的每…

MATLAB中编译器中的变量联系到Simulink

MATLAB中编译器中的变量联系到Simulink 现在编译器中创建变量&#xff0c;进行编译&#xff0c;使其生成在工作区。 然后在Simulink中国使用变量即可。

操作视频的开始与暂停

调用 ref.current.play() 方法来播放视频&#xff1b; 如果视频需要暂停&#xff0c;我们调用 ref.current.pause() 方法来暂停视频。 通过 useRef 创建的 ref 操作视频的开始与暂停 当用户点击按钮时&#xff0c;根据当前视频的状态&#xff0c;我们会开始或暂停视频&…

如何利用开源工具搭建AI大模型底座

开源社区是技术发展的一个重要部分&#xff0c;对于AI大模型来说&#xff0c;也是如此。 我们在这篇文章中来尝试通过开源工具来构建AI大模型的底座&#xff0c;涉及到的技术包括&#xff1a; LangchainOpenAIFlowiseLocalAILlama 使用Langchain构建第一个对话应用 如果你使…

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测…