image

编辑人: 舍溪插画

calendar2025-06-12

message6

visits595

2023年09月C语言七级答案及解析

一、编程题

1、红与黑
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
时间限制:1000
内存限制:65536
输入
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下 1)‘.’:黑色的瓷砖; 2)‘#’:白色的瓷砖; 3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。 当在一行中读入的是两个零时,表示输入结束。
输出
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
样例输入

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

样例输出

45

参考答案:

解析:【喵呜刷题小喵解析】这是一个典型的广度优先搜索(BFS)问题。我们可以使用队列来存储待访问的瓷砖,并使用一个二维数组来标记已经访问过的瓷砖。首先,我们定义一个函数`count_tiles`,它接受三个参数:瓷砖的数量`W`和`H`,以及瓷砖的颜色矩阵`grid`。在函数内部,我们创建一个二维数组`visited`,用于标记已经访问过的瓷砖。然后,我们创建一个队列`queue`,用于存储待访问的瓷砖。队列中的元素是瓷砖的坐标。接下来,我们遍历整个瓷砖矩阵,将初始位置以外的所有黑色瓷砖加入队列。然后,我们进入一个循环,只要队列不为空,就持续进行循环。在每次循环中,我们从队列中取出一个瓷砖,然后遍历它的四个相邻瓷砖。如果相邻瓷砖是黑色的,并且没有被访问过,我们就将其加入队列,并将其标记为已访问。同时,我们增加计数器`count`的值。最后,我们返回计数器`count`的值,即我们能够到达的黑色瓷砖的数量。在主程序中,我们读取输入,直到读取到两个零为止。对于每个数据集合,我们调用`count_tiles`函数,并输出结果。

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

DBACEGF ABCDEFG
BCAD CBAD

样例输出

ACBFGED
CDAB

参考答案:

解析:【喵呜刷题小喵解析】根据题目描述,需要根据二叉树的前序遍历和中序遍历来重建二叉树,并求出其后序遍历。首先,我们定义一个TreeNode类来表示二叉树的节点。每个节点包含一个值,以及左右子树。然后,我们定义buildTree函数来根据前序遍历和中序遍历重建二叉树。函数的基本思路是:首先找到前序遍历的第一个元素作为根节点,然后在中序遍历中找到该元素,从而确定左子树和右子树。然后递归地对左子树和右子树进行同样的操作。最后,我们定义postorderTraversal函数来求二叉树的后序遍历。函数的基本思路是使用一个栈来模拟后序遍历的非递归算法。首先将根节点入栈,然后不断弹出栈顶元素,并将其值加入结果列表中。如果弹出的节点有右子树,则将右子树入栈;如果弹出的节点有左子树,则将左子树入栈。最后将结果列表反转,即可得到后序遍历的结果。在主函数中,我们不断读入前序遍历和中序遍历,然后调用buildTree函数重建二叉树,并调用postorderTraversal函数求其后序遍历,最后输出结果。

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

参考答案:

解析:【喵呜刷题小喵解析】这个题目要求实现一个模拟叠猪的游戏,可以添加猪、移除猪顶的猪以及查询当前最轻的猪的重量。我们可以使用Python的heapq库来实现这个功能。在这个程序中,我们使用了Python的heapq库来创建一个最小堆,堆中的元素是猪的重量,但我们在添加猪到堆中时,使用的是猪的负重量,这样最轻的猪就会位于堆顶。我们定义了三个函数:* `push(weight)`:接收一个猪的重量作为参数,如果重量非负,则将其添加到堆中。* `pop()`:从堆中移除并返回堆顶的猪的重量,如果堆为空,则不执行任何操作。* `min()`:返回当前堆中最轻的猪的重量,如果堆为空,则返回None。在主程序中,我们不断从标准输入读取命令,并根据命令执行相应的操作。如果命令是'pop',则调用`pop()`函数;如果命令是'min',则调用`min()`函数并打印结果;如果命令是'push',则读取猪的重量并调用`push()`函数。如果命令不是上述三种之一,则退出程序。

4、表达式·表达式树·表达式求值
众所周知,任何一个表达式,都可以用一棵表达式树来表示。例如,表达式a+b*c,可以表示为如下的表达式树:

/ \
a *
/ \
b c

现在,给你一个中缀表达式,这个中缀表达式用变量来表示(不含数字),请你将这个中缀表达式用表达式二叉树的形式输出出来。
时间限制:1000
内存限制:65535
输入
输入分为三个部分。 第一部分为一行,即中缀表达式(长度不大于50)。中缀表达式可能含有小写字母代表变量(a-z),也可能含有运算符(+、-、*、/、小括号),不含有数字,也不含有空格。 第二部分为一个整数n(n < 10),表示中缀表达式的变量数。 第三部分有n行,每行格式为C x,C为变量的字符,x为该变量的值。
输出
输出分为三个部分,第一个部分为该表达式的逆波兰式,即该表达式树的后根遍历结果。占一行。 第二部分为表达式树的显示,如样例输出所示。如果该二叉树是一棵满二叉树,则最底部的叶子结点,分别占据横坐标的第1、3、5、7……个位置(最左边的坐标是1),然后它们的父结点的横坐标,在两个子结点的中间。如果不是满二叉树,则没有结点的地方,用空格填充(但请略去所有的行末空格)。每一行父结点与子结点中隔开一行,用斜杠(/)与反斜杠(\)来表示树的关系。/出现的横坐标位置为父结点的横坐标偏左一格,\出现的横坐标位置为父结点的横坐标偏右一格。也就是说,如果树高为m,则输出就有2m-1行。 第三部分为一个整数,表示将值代入变量之后,该中缀表达式的值。需要注意的一点是,除法代表整除运算,即舍弃小数点后的部分。同时,测试数据保证不会出现除以0的现象。
样例输入

a+b*c
3
a 2
b 7
c 5

样例输出

abc*+
   +
  / \
 a   *
    / \
    b c
37

参考答案:

解析:【喵呜刷题小喵解析】:本题要求将中缀表达式转化为表达式树,并输出其逆波兰式、树形表示和表达式的值。首先,我们需要将中缀表达式转化为逆波兰式。中缀表达式转化为逆波兰式的基本思路是使用一个栈来保存运算符,遍历中缀表达式的每个字符,如果是变量则直接加入结果列表,如果是运算符则弹出栈顶的运算符直到栈为空或该运算符的优先级高于当前运算符,然后将当前运算符入栈。遍历结束后,将栈中剩余的运算符加入结果列表。然后,我们可以利用逆波兰式构建表达式树。首先,我们需要构建一个与逆波兰式等长的节点列表,然后将逆波兰式中的每个字符依次加入节点列表。如果字符是变量,则直接加入;如果字符是运算符,则将其父节点的两个子节点依次加入。最后,我们可以计算表达式的值。首先,我们需要将每个变量的值保存在一个字典中。然后,我们遍历逆波兰式,如果是变量,则直接取出对应的值;如果是运算符,则取出对应的两个子节点的值进行运算,并将结果保存回字典中。最后,返回字典中变量a的值即为表达式的值。注意,除法代表整除运算,即舍弃小数点后的部分。同时,测试数据保证不会出现除以0的现象。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年09月C语言七级答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share