蓝桥杯真题31日冲刺 | 每日题解报告 excel的妙用 第四天

大家好 我是泡泡 今天的题解有excel的妙用哦 

目录

一、奇数倍数

二、第几个幸运数字

三、四平方和

四、迷宫


一、奇数倍数

题目链接:奇数倍数 - 蓝桥云课 (lanqiao.cn)

题目要求:

请你找到最小的整数 X 同时满足:

  1. XX 是 2019 的整倍数;
  2. XX 的每一位数字都是奇数。

解题思路:

最简单的暴力,就不过多赘述了,都在代码里。

​
#include<bits/stdc++.h>
using namespace std;
bool pd(int x)
{
	while(x)
	{
		if(x%10%2==0)//计算每一位 如果是偶数 就返回false
		{
			return false;
		}
		x/=10;
	}
	return true;
}
int main()
{
	for(int i=2019;;i+=2019)//2019的倍数 所以+2019
	{
		if(pd(i))//如果是纯奇数
		{
			cout<<i;//输出
			break;
		}
	}
	return 0;
} 

​

二、第几个幸运数字

题目链接:第几个幸运数字 - 蓝桥云课 (lanqiao.cn)

题目要求:

到 X 星球旅行的游客都被发给一个整数,作为游客编号。

X 星的国王有个怪癖,他只喜欢数字 3,53,5 和 77。

国王规定,游客的编号如果只含有因子:3,5,73,5,7,就可以获得一份奖品。

我们来看前 1010 个幸运数字是:

3 5 7 9 15 21 25 27 35 453579152125273545

因而第 1111 个幸运数字是: 4949

小明领到了一个幸运数字 5908470958750559084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。

请你帮小明计算一下,5908470958750559084709587505 是第几个幸运数字。

解题思路:

也是一个暴力的题,不难,看代码。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long num = 1;
	int sum = 0;//幸运数因子只含有3,5,7,所以幸运数必定满足3的i次方乘以5的j次方乘以7的z次方。
	for(int i=0;pow(3,i)<59084709587505;i++)
	{
		for(int j=0;pow(5,j)<59084709587505;j++)
		{
			for(int z=0;pow(7,z)<59084709587505;z++)
			{
				num = pow(3,i)*pow(5,j)*pow(7,z);
				if(num<=59084709587505&&num>1)
				{
					sum++;
				}
			}
		}
	}
    cout<<sum;
    return 0;
}

三、四平方和

题目链接:“蓝桥杯”练习系统 (lanqiao.cn)

题目要求:

        四平方和定理,又称为拉格朗日定理:
        每个正整数都可以表示为至多4个正整数的平方和。
  如果把0包括进去,就正好可以表示为4个数的平方和。

  比如:
  5 = 0^2 + 0^2 + 1^2 + 2^2
  7 = 1^2 + 1^2 + 1^2 + 2^2
  (^符号表示乘方的意思)

  对于一个给定的正整数,可能存在多种平方和的表示法。
  要求你对4个数排序:
  0 <= a <= b <= c <= d
  并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法


  程序输入为一个正整数N (N<5000000)
  要求输出4个非负整数,按从小到大排序,中间用空格分开

解题思路:
暴力+稍微优化就可以AC了,如果用4层for循环直接暴力的话肯定G了,那么优化一下。最后一层for循环是没必要的,因为它可以通过前三次循环来计算出来的,再进行判断是否符合就可以了,并且用x*x<=n/k来控制循环的终止条件可以减少循环次数。因为a是四个数里最小的,它的最小值是0,最大值是500万除以4;b最小值也是0,因为b是bcd三个数中最小的,所以b的最大值是500万除以3 然后就可以推出c和d的最大值。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i*i<=n/4;i++)
	{
		for(int j=i;j*j<=n/3;j++)
		{
			for(int z=j;z*z<=n/2;z++)
			{
				double num = sqrt(n-i*i-j*j-z*z);
				int sum = sqrt(n-i*i-j*j-z*z);
				if(num==sum)
				{
					cout<<i<<" "<<j<<" "<<z<<" "<<sum;
					return 0; 
				}
			}
		}
	}
}

四、迷宫

题目链接:迷宫 - 蓝桥云课 (lanqiao.cn)

题目要求:

下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。

010000
000100
001001
110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 1010 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30行 50列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。

请注意在字典序中 D<L<R<U。

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

解题思路:

 正解是BFS,可以用excel做,我把俩方法都写出来。

BFS:

这道题在每个点上记录它的前驱结点就够了,这样从终点能一步步回溯到起点,得到一条完整路径。注意看 print_path(),它是递归函数,先递归再打印。从终点开始,回溯到起点后,再按从起点到终点的顺序,正序打印出完整路径。

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x;
    int y;
};
char mp[31][51];  //存地图
char k[4]={'D','L','R','U'};
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};
int vis[30][50];  //1:已经搜过,不用再搜
char pre[31][51];   //用于查找前驱点。例如pre[x][y] = ‘D’,表示上一个点往下走一步到了(x,y),那么上一个点是(x-1,y)
void print_path(int x,int y)
{      //打印路径:从(0,0)到(29,49)
  if(x==0 && y==0)   //回溯到了起点,递归结束,返回
     return;
  if(pre[x][y]=='D')  print_path(x-1,y);   //回溯,往上 U
  if(pre[x][y]=='L')  print_path(x,  y+1); //回溯,往右 R
  if(pre[x][y]=='R')  print_path(x,  y-1);
  if(pre[x][y]=='U')  print_path(x+1,y);
  printf("%c",pre[x][y]);                  //最后打印的是终点
}
void bfs()
{
    node start; start.x=0;  start.y=0;
    vis[0][0]=1;               //标记起点被搜过
    queue<node>q;
    q.push(start);             //把第一个点放进队列,开始BFS
    while(!q.empty()){
        node now=q.front();
        q.pop();
        if(now.x==29 && now.y==49){ 
            print_path(29,49);  
           //打印完整路径,从终点回溯到起点,打印出来是从起点到终点的正序
            return;
        }
        for(int i=0;i<4;i++){
            node next;
            next.x = now.x+dir[i][0];
            next.y = now.y+dir[i][1];
             if(next.x<0||next.x>=30||next.y<0||next.y>=50)
                continue;
            if(vis[next.x][next.y]==1 || mp[next.x][next.y]=='1')  
                continue;
            vis[next.x][next.y]=1;
            pre[next.x][next.y] = k[i];   //记录点(x,y)的前驱
            q.push(next);
        }
    }
}
int main(){
    for(int i=0;i<30;i++)  cin >> mp[i];  
    bfs();
}

excel大法:

感谢yzm10和知乎某匿名用户的经验,搞了一个比较完善的excel。

效果图

Excel在蓝桥中的普及已经不是第一次了,这里要求会使用替换功能即可。

好了话不多说,第一步需要将01迷宫复制粘贴进txt里,然后将“0”“1”分别替换为“(Tab)0”“(Tab)1”。

(Tab)注:在txt里敲入Tab,即可显示一段空白,复制下来就好。

替换完后是这个样子的:

然后将txt中的内容粘到Excel中,就成了下图:

将表格中1的底色替换为其他颜色,同理也可以将0替换成空格,目的都是为了便于识别。

好了,现在障碍设成了深蓝色,我们也可以将列宽适当得调小些,使单元格看起来更像正方形。

最后一步,把表格截图后用画图打开,就可以用笔来模拟走迷宫了~(如效果图所示)

实践证明,熟练掌握这种做法在考试时并不会占用太多时间

(就是容易出错,yzm10考试时就把路径输反了。。所以一定要细心检查)

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
蓝桥杯是一个国内著名的计算机比赛,为了帮助参赛者更好地准备和了解比赛的题型,组委会会公布历年的真题并提供相应的题解。 首先,我们需要了解蓝桥杯是一个综合性的计算机比赛,测试的对象包括计算机基础知识、编程能力以及解决实际问题的能力。 在历年的真题中,参赛者将面临不同类型的题目,包括算法设计与优化问题、数据结构算法问题、编程题等。其中针对Python B组的题目主要考察的是对Python语言的掌握和应用能力。 题目解答一般会包含以下几个方面的内容: 1. 题目分析与理解:读取题目,理解题目的要求和限制条件。通过仔细分析题目,确定题目的输入与输出,以及问题的核心。 2. 设计解决方案:根据题目要求和限制条件,设计一个合适的解决方案。可以使用合适的算法数据结构来解决问题,并做出相应的性能优化。 3. 编写代码实现:根据设计的方案编写相应的代码实现。需要注意的是,Python语言有其独特的语法和特性,掌握好这些特性可以更好地完成编程任务。 4. 调试与测试:编写完代码后,需要进行调试和测试。通过运行样例输入和输出,检查代码是否符合题目要求,并且没有逻辑上的错误。 5. 总结与优化:在完成题目解答后,可以进行总结和优化。包括分析算法复杂度、代码风格和可读性等方面,以便在比赛中更好地表现。 在准备蓝桥杯时,可以通过阅读历年的真题和题解来了解比赛的难度和类型,针对性地进行练习和提高。同时也可以参加相关的培训班和讨论活动,与其他参赛者交流经验和技巧。 总而言之,历年蓝桥杯真题的解答对于提高自己的编程能力和应对比赛非常有帮助。通过认真分析和实践,可以更好地理解并掌握Python编程,并在比赛中取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cloud、泡泡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值