lanqiaobei22-28

蓝桥杯[每日题例] c++ 1065.寻找2020

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一个数字矩阵,里面只包含数字 00 和 22。小蓝很喜欢 20202020,他想找 到这个数字矩阵中有多少个 20202020 。 小蓝只关注三种构成 20202020 的方式:
同一行里面连续四个字符从左到右构成 20202020。
同一列里面连续四个字符从上到下构成 20202020。
在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 20202020。
例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个 是斜线上的。
小蓝的矩阵比上面的矩阵要大,如下给出了小蓝的矩阵。

请帮助小蓝确定在他的矩阵中有多少个 2020。

#include <iostream>
using namespace std;
int main()
{
    // 请在此输入您的代码
    //详细过程
    char str[310][310];//将文本复制到记事本中可以看到是300行301列,将数组写大一点以防越界
    int i,j,c=0;

    //将小蓝的矩阵输入到str[][]中
    for(i=0;i<300;i++)
    {
        for (int j = 0; j < 300; j++)
        {
            cin >> str[i][j];
        }
    }

    for(i=0;i<300;i++)
    {
        for(j=0;str[i][j]!='\0';j++)
        {
            //用于判断行内是否有2020
            if(str[i][j]=='2'&&str[i][j+1]=='0'&&str[i][j+2]=='2'&&str[i][j+3]=='0')
            {
              c++;
            }
            //用于判断列内是否有2020
            if(str[i][j]=='2'&&str[i+1][j]=='0'&&str[i+2][j]=='2'&&str[i+3][j]=='0')
            {
              c++;
            }
            //用于判断对角线内是否有2020
            if(str[i][j]=='2'&&str[i+1][j+1]=='0'&&str[i+2][j+2]=='2'&&str[i+3][j+3]=='0')
            {
              c++;
            }
        }
    }
    cout << c << endl;
    //以上需要手动输入小蓝的矩阵这里就不输入了,到c结果为16520
    cout << 16520 << endl;
    return 0;
}

思路:对于该题,我们先进行横向的一组四位数进行先判断,然后再将每一位+1进行向后移位,每找到一次2020就对计数器c+1最后对c进行输出即可,考虑到矩阵较大可以定义一个二维数组将小蓝的矩阵放于该二维数组中,但由于题目中给的矩阵是一个300*300的矩阵,我就不一一输入了

蓝桥杯[每日题例] c++ 1028.和数个数

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

一个数如果除了
1 和自己还有其他约数,则称为一个合数。例如:
1, 2, 3 不是合数,
4, 6 是合数。
请问从 1 到 2020 一共有多少个合数。

#include <iostream>
using namespace std;
int main()
{
    // 请在此输入您的代码
    int cnt = 0;
    //循环拿到3——2020的数
    for (int i = 3; i <= 2020; i++) 
    {
        //拿到比外层循环小的数
        for (int j = 2; j < i; j++) 
        {
            //判断外层循环的数是否能除的进内层循环的其中一个数可以就对c进行++并跳出该次循环防治对应的因子再次判断导致c再次++
            if (i % j == 0) 
            {
                cnt++;
                break;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}

思路:直接用大数除以比他小的数,并判断是否能除的尽,能得c++,不能直接跳过该数即可,本题还可以优化时间复杂度,因为小因子能推出大因子所以没必要,内层计算完所有可能,该数的pow(j)次即可,这样能将时间复杂的降到O(n)*log2O(n)

蓝桥杯[每日题例] c++ 2408.特殊日期

问题描述
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。
请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字
之和等于月的数位数字之和加日的数位数字之和。
例如,2022 年 11 月 13 日满足要求,因为
2 + 0 + 2 + 2 = (1 + 1) + (1 + 3)2 + 0 + 2 + 2 = (1 + 1) + (1 + 3) 。
请提交满足条件的日期的总数量。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include <iostream>
using namespace std;

int main()
{
    //记录每个月的天数
    int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    int count = 0;
    //年份
    for (int year = 1900; year <= 9999; year++)
    {
        //记录年的所有个位数之和
        int t = year % 10 + year / 10 % 10 + year / 100 % 10 + year / 1000;
        
        //判断是否为闰年
        if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
        {
            month[1] = 29;
        }  
        else
        {
            month[1] = 28;
        }
        //月份  
        for (int m = 0; m < 12; m++)
        {
            //日期
            for (int day = 1; day <= month[m]; day++)
            {
                //统计满足要求的年数并进行累加
                if (t == (m + 1) % 10 + (m + 1) / 10 + day % 10 + day / 10)
                {
                    count++;
                }
                //满足条件跳出
                if (year == 9999 && m == 11 && day == 31)
                {
                    break;                    
                }
            }
        }
    }
    cout << count;//输出计数
    return 0;
}

总结:


​ 先判断是不是闰年,定义一个数组记录12个月的天数,再将是闰年的那一天的二月进行赋值为29天,不是再将其赋值回28天,再对该天的每一位取出并进行相应的判断,条件成立即对计数器count进行++,最后输出count即可。

蓝桥杯[每日题例] c++ 541.合法日期

题目描述
小蓝正在上小学,老师要求同学们在暑假每天记日记。可是小蓝整个暑假都在玩,直到最后一天才想起要记日记。
于是小蓝赶紧编了一些日记交给老师。没想到,日记很快就被老师发现了问题,原来小蓝记完 8 月 31 日的日记,
竟又记了 8 月 32 日和 8 月 33 日的日记。这显然是有问题的,因为根本没有 8 月 32 日和 8 月 33 日。

给定一个月份和一个日期,请问 2021 年有没有这一天。

#include <iostream>
using namespace std;
int main()
{
	int month[31] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int m, d;
	cin >> m >> d;
	if (month[m] < d)
	{
		cout << "no";
	}
	else 
	{
		cout << "yes";
	}		
	return 0;
}

思路:输入月日先判断月是否正确,再判断日是否正确即可

蓝桥杯[每日题例] c++ 648.贪吃蛇长度

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

  • ------------------------------------------------ - +
    | |
    | H###### #### |
    | # # # |
    | # # # |
    | # #### # # |
    | # # # # # |
    | ######@### # # |
    | # #### # # |
    | # # # # # |
    | ####@#######@### # # |
    | # # # # # |
    | T ##### # # # ## |
    | # # ### ### ## |
    | ################ # # #### |
    | # # # # |
    | ############## #######@########## |
    | # ### |
    | ########################### |
    +------------------------------------------------ - +

小明在爷爷的私人收藏馆里找到一台老式电脑。居然没有图形界面,只能用控制台编程。
经过小明的一阵摸索,神奇地设计出了控制台上的贪食蛇游戏。
如上,是游戏时画面截图。
其中,H表示蛇头,T表示蛇尾。# 表示蛇的身体,@ 表示身体交叉重叠的地方。 你能说出现在的贪吃蛇长度是多少吗?
其实,只要数出 # 的数目算 1,数出 @的数目算的数目算2,再加上头尾各算,再加上头尾各算1 就计算好了。
人工数一下?太累眼睛了,聪明的你为什么不让计算机帮忙呢?
本题的要求就是: 请输出上图中贪食蛇的长度是多少?

#include <iostream>
#include <string>

using namespace std;
int main()
{
	// 请在此输入您的代码
	//定义count记录长度
	int count = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9 };
	string str = "##################################@#####################@#######@#############################################################################@#########################################";
	for (int i = 0; i < str.length(); i++)
	{
        //对蛇身处没有重叠的地方进行判断
		if (str[i] == '#')
		{
			count++;
		}
        //因为我删除了空格和头尾所以该字符串蛇要么是不重叠的要么就是重叠的地方
		else
		{
			count += 2;
		}
	}
    
	cout << count + 4 << endl;
	return 0;
}

思路:可以将该表定义为一个二维数组并遍历该二维数组并对H,T,#,@四个符号进行判断即可,我这里直接手动去掉空格和H,T的长度并在最后输出count时将H,T的长度加回来即可

蓝桥杯[每日题例] c++ 2361.车牌

问题描述
A市的车牌由六位组成, 其中前三位可能为数字 0 至 9, 或者字母 A 至 F, 每位有 16 种可能。
后三位只能是数字 0 至 9。为了减少攀比, 车牌中不能有连 续三位是相同的字符。
例如, 202020 是合法的车牌, AAA202 不是合法的车牌, 因为前三个字 母相同。
请问, A 市有多少个合法的车牌 ?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数,
在提交答案时只填写这个整数, 填写多余的内容将无法得分。

#include <iostream>
using namespace std;
bool check(int a, int b, int c, int d, int e, int f) {
    //判断连续三个数是否相同即可相同则该车牌不合法,返回一个false
    //不同则该车牌合法,返回一个true
    if (a == b && b == c) return false;
    if (b == c && c == d) return false;
    if (c == d && d == e) return false;
    if (d == e && e == f) return false;
    return true;
}
int main()
{
    // 请在此输入您的代码
    int count = 0;

    //暴力遍历车牌的每一种可能,并调用check()函数判断条件是否成立即可
    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++) {
            for (int k = 0; k < 16; k++) {
                for (int x = 0; x < 10; x++) {
                    for (int y = 0; y < 10; y++) {
                        for (int z = 0; z < 10; z++) {
                            if (check(i, j, k, x, y, z)) {
                                count++;
                            }
                        }
                    }
                }
            }
        }
    }
    cout << count << endl;
    return 0;
}

思路:该题数据比较小,直接暴力查找所有的车牌可能性并判断是否成立即可

posted @ 2023-04-23 16:41  风起鹤归  阅读(84)  评论(0)    收藏  举报