🐏第十三届蓝桥杯模拟赛🐏
🐏填空题🐏
🐏第一题🐏
以下是一个 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 列的值是多少?
这和我之前做过的题很像,我们只需要分析四种情况
循环指向:
- 从左到右构造最上侧的一行,x不变,y+1
- 从上到下构造最右侧的一列,x+1,y不变
- 从右到左构造最下方的一行,x不变,y-1
- 从下到上构造最左侧的一列,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
🐏写到最后🐏
最后看到这了,如果觉得自己有收获的话,可以给博主点个关注哦
觉得本篇文章不错的话记得收藏⭐,点赞👍,还有问题也可以评论留言💬
你的支持将是我继续创作的最大动力❤️❤️❤️
由于作者水平有限,如有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!