第十三届蓝桥杯模拟赛填空题

🐏第十三届蓝桥杯模拟赛🐏

🐏填空题🐏

🐏第一题🐏

以下是一个 25 行 25 列的字母矩阵,全部由字母 A 和 B 组成。
AAAAAAABABBAABABABAAAAAAA
ABBBBBABBAABBBBBABABBBBBA
ABAAABABBBABAABBBBABAAABA
ABAAABABBBBBAABAABABAAABA
ABAAABABBABABBABABABAAABA
ABBBBBABBBABAABBBBABBBBBA
AAAAAAABABABABABABAAAAAAA
BBBBBBBBABAABABBBBBBBBBBB
AABAABABBAAABBAAABABBBBBA
ABBABABBBABBAAAABBBBAAAAB
BBBBAAABABAABABAABBBAABBA
BBAABABABAAAABBBAABBAAAAA
ABABBBABAABAABABABABBBBBA
AAAABBBBBABBBBAAABBBABBAB
AABAABAAABAAABAABABABAAAA
ABBBBBBBBABABBBBABAABBABA
ABBBAAABAAABBBAAAAAAABAAB
BBBBBBBBABBAAABAABBBABBAB
AAAAAAABBAAABBBBABABAABBA
ABBBBBABBAABABAAABBBABBAA
ABAAABABABBBAAAAAAAAAABAA
ABAAABABABABBBABBAABBABAA
ABAAABABBABBABABAABAABAAA
ABBBBBABABBBBBABBAAAABAAA
AAAAAAABAABBBAABABABBABBA
请问在这个矩阵中有多少个字母 A?

第一题比较简单吧,我的思路就是直接判断每个输入的数是否为A,是A就 j ++,请看代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
	char x;
	int j = 0;
	for(int i = 0 ; i < 625 ; i ++)
	{
		cin >> x;
		if(x == 'A')
		{
			j++;
		}
	}
	
	cout << j ;
} 

最后答案是:318
在这里插入图片描述

🐏第二题🐏

如果一个整数的某个数位包含 2 ,则称这个数为一个“最 2 数字”。例如:102、 2021 都是最 2 数字。 请问在 1(含) 到 2021(含) 中,有多少个最 2 数字。

第二题也比较简单,只需要将每个数的每位数上的数扣出来判断是否为2就可以了,需要注意的是有一个为2就加1,那么其他位就不用再加了。

先看比较直接的写法:

#include<bits/stdc++.h>

using namespace std;

int main()
{
	int cnt = 0;
	bool flag = false;
	for(int x = 1 ; x <=2021 ; x++)
	{
		if(x%10 == 2)//判断个位是否为2
		{
			cnt ++;	
			flag = true;
		}
		if(!flag)
		{
			if(x/10%10==2)//判断十位是否为2
			{
				cnt ++;
				flag = true;
			}
		}
		if(!flag)
		{
			if(x/100%10==2)//判断百位是否为2
			{
				cnt ++;
				flag = true;
			}
		}
		if(!flag)
		{
			if(x/1000%10==2)//判断千位是否为2
			{
				cnt ++;
				flag = true;
			}
		}
		flag = false;
	}
	cout << cnt;
	return 0;
}

调用函数写法:

#include<bits/stdc++.h>

#define ll long long

using namespace std;

bool flag(int a) 
{
	while(a) 
	{
		int t = a % 10;
		a /= 10;
		if (t == 2) return true;//判断每各位上的数是否为2,是就return。
	}
	return false;
}
void solve() 
{
	int ans = 0;
	for (int i = 1; i <= 2021; i++) 
	{
		if (flag(i)) ans++;
	} 
	cout << ans;
}
int main() 
{
	solve();
    return 0;
}

答案应该是:564

🐏第三题🐏

有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。 例如,2021
经过一次操作可以变成 2020、2022。 再如,2022 经过一次操作可以变成 2021、2023 或 1011。 请问,2021
最少经过多少次操作可以变成 1。

暴力写法,如果一个数为偶数就 / 2 ,如果是奇数就 - 1

#include<bits/stdc++.h>

using namespace std;

int main()
{
	int x = 2021;
	int cnt = 1;
	while(x != 1)
	{
		if(x % 2 == 1) 
		{
			x -= 1;
			cnt ++;
		}
		else 
		{
			x /= 2;
			cnt ++;
		}
	}
	cout << cnt;
}

答案是:18

想了想这种求最短路的问题可以用BFS求解,但试着写了下,没写出来。。

希望有大佬看到了可以帮我一下。

🐏第四题🐏

对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数, 我们称填好的表格为一个螺旋矩阵。 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7 12 11 10 9 8 请问,一个 30 行 30 列的螺旋矩阵,第 20 行第 20 列的值是多少?

这和我之前做过的题很像,我们只需要分析四种情况

循环指向:

  1. 从左到右构造最上侧的一行,x不变,y+1
  2. 从上到下构造最右侧的一列,x+1,y不变
  3. 从右到左构造最下方的一行,x不变,y-1
  4. 从下到上构造最左侧的一列,y不变,x-1

先给大家看一下暴力解法:

#include<iostream>

using namespace std;

	int n = 30 ,m = 30;
	int k=1;
	int f[110][110];
	
int main()
{

	//cin>>n>>m;

	for(int x=1;x<=n;x++)
	{
		for(int y=0;y<m;y++)
		{
			while(k<=n*m)
			{
				while(f[x][y+1]==0&&y<m) f[x][++y]=k++;//x不变,y+1
				while(f[x+1][y]==0&&x<n) f[++x][y]=k++;//x+1,y不变
				while(f[x][y-1]==0&&y>1) f[x][--y]=k++;//x不变,y-1
				while(f[x-1][y]==0&&x>1) f[--x][y]=k++;//y不变,x-1
			}
		}
	}
//	for(int x=1;x<=n;x++){
//		for(int y=1;y<=m;y++){
//			printf("%4d",f[x][y]);
//		}
//		cout<<endl;
//	}
	cout << f[20][20];
	return 0;
} 

然后我们可以把4个偏移量存进数组:

#include <iostream>

using namespace std;

int res[100][100];

int main()
{
    int n = 30, m = 30;
    //cin >> n >> m;

    int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};//四个偏移量

    for (int x = 0, y = 0, d = 0, k = 1; k <= n * m; k ++ )
    {
        res[x][y] = k;
        int a = x + dx[d], b = y + dy[d];
        if (a < 0 || a >= n || b < 0 || b >= m || res[a][b])
        {
            d = (d + 1) % 4;
            a = x + dx[d], b = y + dy[d];
        }
        x = a, y = b;
    }

//    for (int i = 0; i < n; i ++ )
//    {
//        for (int j = 0; j < m; j ++ ) printf("%4d",res[i][j]);
//        cout << endl;
//    }
	cout << res[19][19];

    return 0;
}

最后答案:819
在这里插入图片描述

🐏第五题🐏

一棵二叉树有 2021 个结点。该树满足任意结点的左子树结点个数和右子树的结 点个数之差最多为 1。 定义根结点的深度为 0,子结点的深度比父结点深度多 1。 请问,树中深度最大的结点的深度最大可能是多少?

依题意得这颗二叉树为完全二叉树,按照完全二叉树的公式,深度为k的二叉树结点个数为 2^k - 1;

2^11 = 2048, 2^10 = 1024;

所以答案深度: 11-1 = 10

🐏写到最后🐏

最后看到这了,如果觉得自己有收获的话,可以给博主点个关注哦
觉得本篇文章不错的话记得收藏⭐,点赞👍,还有问题也可以评论留言💬
你的支持将是我继续创作的最大动力❤️❤️❤️
由于作者水平有限,如有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊努力变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值