2021年12月青少年C/C++软件编程(三级)等级考试试卷及答案解析

目录

1 我家的门牌号

2 字串计算

3 吃糖果

4 拨钟问题

5 方形盒


1 我家的门牌号

时间限制:1000

内存限制:65536

我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。数据保证有唯一解。

输入

一个正整数n。n < 100000。

输出

一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。

样例输入

100

样例输出

10 15

解析:用for循环对门牌号逐个尝试,详情看code

不准直接抄!!!

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int n,home,x;
    int i;
    cin>>n;
    for(i=1;; i++) //从家的门牌号开始逐个尝试
    {
        if((i*i+i-2*n)%4==0)
        {
            x=(i*i+i-2*n)/4;
            if(x<=0)	continue;//x不可能<1
            if(x>0)//找到后
            {
                cout<<x<<" "<<i;//输出
                return 0;//终止循环
            }
        }
    }
    return 0;
}

2 字串计算

时间限制:1000

内存限制:65536

给出一个只包含0和1的字符串(长度在1到100之间),求其每一个子串出现的次数。

输入

一行,一个01字符串。

输出

对所有出现次数在1次以上的子串,输出该子串及出现次数,中间用单个空格隔开。按子串的字典序从小到大依次输出,每行一个。

样例输入

10101

样例输出

0 2
01 2
1 3
10 2
101 2

解析:dfs深搜,上code!

不准直接抄!!!

#include <cstring>
#include <iostream>
using namespace std;

char a[105], s[101];
void dfs(int n) //dfs深搜
{
    int h = 0;
    for (int i = 0; i <= strlen(a) - n; i++)//i<=字符数组a的长度
    {
        int f = 1;
        for (int j = 0; j < n; j++) 
        {
            if (a[i + j] != s[j])
            {
                f = 0;
                break;
            }
        }
        h += f;
    }
    if (h <= 1)
        return;//返回
    for (int i = 0; i < n; i++) 
        cout << s[i];
    cout << ' ' << h << endl;
    s[n] = '0';
    dfs(n + 1);
    s[n] = '1';
    dfs(n + 1);
}

int main() {

    cin >> a;
    s[0] = '0';
    dfs(1);
    s[0] = '1';
    dfs(1);
}

3 吃糖果

时间限制:1000

内存限制:65536

名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。妈妈告诉名名每天可以吃一块或者两块巧克力。假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。例如:如果N=1,则名名第1天就吃掉它,共有1种方案;如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案;如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案;如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。现在给定N,请你写程序求出名名吃巧克力的方案数目。

输入

输入只有1行,即整数N。

输出

输出只有1行,即名名吃巧克力的方案数。

样例输入

4

样例输出

5

解析:循环,上code!

不准直接抄!!!

#include<iostream>
using namespace std;

long long a[75];

int main() {

    int n;
    a[1] = 1;
    a[2] = 2;
    a[3] = 4;
    for (int i = 4; i <= 71; i++)
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];
    while (cin >> n && n)
        cout << a[n] << endl;

    return 0;
}

4 拨钟问题

拨钟问题

有9个时钟,排成一个3*3的矩阵。

现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。

移动 影响的时钟

1 ABDE

2 ABC

3 BCEF

4 ADG

5 BDEFH

6 CFI

7 DEGH

8 GHI

9 EFHI

输入

9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。

输出

输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。(数据保证答案唯一)

样例输入

3 3 0
2 2 2
2 1 2

样例输出

4 5 8 9

解析:本题用枚举法解决,详情看code

不准直接抄!!!

#include<iostream>
#include<cstring>
using namespace std;
int main(){

	int oriClock[10] = { 0 };//初始时钟状态
	int curClock[10] = { 0 };//当前时钟状态
	int move[10] = { 0 };//移动操作次数
	for (int i = 1; i < 10; ++i)//读入
		cin >> oriClock[i];
		for (move[1] = 0; move[1] < 4; ++move[1])
		{
			for (move[2] = 0; move[2] < 4; ++move[2])
			{
				for (move[3] = 0; move[3] < 4; ++move[3])
				{
					//枚举第一层的1,2,3号钟操作
					memcpy(curClock, oriClock, sizeof(oriClock));/*memcpy函数的功能是
                    从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址
                    的起始位置中*/                                                                                                             
					//1,2,3号钟操作对本层状态的影响
				    curClock[1] = (curClock[1] + move[1] + move[2]) % 4;
					curClock[2] = (curClock[2] + move[1] + move[2] + move[3]) % 4;
					curClock[3] = (curClock[3] + move[2] + move[3]) % 4;
					//1,2,3号钟操作对下一层状态的影响
					curClock[4] = (curClock[4] + move[1]) % 4;
					curClock[5] = (curClock[5] + move[1] + move[3]) % 4;
					curClock[6] = (curClock[6] + move[3]) % 4;
					//1,2,3号钟状态决定下层的操作
					move[4] = (4 - curClock[1]) % 4;
					move[5] = (4 - curClock[2]) % 4;
					move[6] = (4 - curClock[3]) % 4;
					//4,5,6号钟操作对本层状态的影响
					curClock[4] = (curClock[4] + move[4] + move[5]) % 4;
					curClock[5] = (curClock[5] + move[5]) % 4;
					curClock[6] = (curClock[6] + move[5] + move[6]) % 4;
					//4,5,6号钟操作对下一层状态的影响
					curClock[7] = (curClock[7] + move[4]) % 4;
					curClock[8] = (curClock[8] + move[5]) % 4;
					curClock[9] = (curClock[9] + move[6]) % 4;
					//4,6号钟状态决定下层7,9的操作
					move[7] = (4 - curClock[4]) % 4;
					move[9] = (4 - curClock[6]) % 4;
					//7,9号钟操作对5号钟状态的影响
					curClock[5] = (curClock[5] + move[7] + move[9]) % 4;
					//7,9号钟操作对本层状态的影响
					curClock[7] = (curClock[7] + move[7]) % 4;
					curClock[8] = (curClock[8] + move[7] + move[9]) % 4;
					curClock[9] = (curClock[9] + move[9]) % 4;
					//8号钟状态决定8号钟的操作
					move[8] = (4 - curClock[8]) % 4;
					//8号钟操作对本层状态的影响
					curClock[7] = (curClock[7] + move[8]) % 4;
					curClock[9] = (curClock[9] + move[8]) % 4;
					if (curClock[5] + curClock[7] + curClock[9] == 0)//判断条件:5,7,9号钟
					{
						for (int i = 1; i < 10; ++i)
						{
							while (move[i]--)
								cout << i << " ";
						}
						return 0;
					}
				}

			}
		}

	return 0;
}

5 方形盒

时间限制:1000

内存限制:65536

分形,通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。它跟分数维、自组织、非线性系统和混沌等具有非常重要的联系。分形盒就是这样一种分形,它的定义如下:

维度是1的分形盒:

X

维度是2的分形盒:

X  X

  X

X  X

如果已知维度是(n-1)的分形盒,那么维度是n的分形盒的递归定义如下所示:

Box(n-1)               Box(n-1)

              Box(n-1)

Box(n-1)               Box(n-1)   

你的任务是画一个维度为n的分形盒。

输入

输入包含多组测试数据。每一行包含一个正整数n表示分形盒的维度,n不大于7;最后一行是一个-1,表示输入结束。

输出

对于每组测试数据,输出要求维度的分形盒,注意X为大写字母。每组测试数据之后包含一行,改行只包含一个破折号。

样例输入

1
2
3
4
-1

样例输出

X
-
X X
 X
X X
-
X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X
-
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
-

解析:本题用递归就能解决,详情看code

不准直接抄!!!

#include <iostream>
#include <cmath>//调用后面的pow函数,也可用#include <math.h>
#include <string.h>//调用memset
using namespace std;

char a[2200][2200];
void draw(int x, int y, int n) 
{ //左上角为x,y,画一个层数为n的分型盒
    if (n == 0)
    {
        a[x][y] = 'X';
        return;//返回
    }
    draw(x, y, n - 1); //左上
    draw(x, y + 2 * pow(3, n - 1), n - 1);//右上
    draw(x + 2 * pow(3, n - 1), y, n - 1); //左下
    draw(x + 2 * pow(3, n - 1), y + 2 * pow(3, n - 1), n - 1); //右下
    draw(x + pow(3, n - 1), y + pow(3, n - 1), n - 1);//中
}

int main() {

    int n;
    while (1) 
    {
        memset(a, 0, sizeof(0));/*将数值0以单个字节逐个拷贝的
方式放到指针变量a所指的内存中去。*/
        cin >> n;
        if (n == -1)
            break;//跳出循环
        draw(1, 1, n - 1);//调用darw
        for (int i = 1; i <= pow(3, n - 1); i++) 
        {
            for (int j = 1; j <= pow(3, n - 1); j++)
            {
                if (a[i][j] == 0) 
                    cout << " ";
                else
                    cout << "X";
            }
            cout << endl;

        }
        cout << "-" << endl;
    }

    return 0;
}

作者制作不易,喜欢就用你发财的小手给作者点个赞,点个关注吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值