蓝桥杯刷题冲刺 | 倒计时13天

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

文章目录

  • 1.母牛的故事
  • 2.魔板

1.母牛的故事

  • 题目

    链接: [递归]母牛的故事 - C语言网 (dotcpp.com)

    有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

    输入格式

    输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
    n=0表示输入数据的结束,不做处理。

    输出格式

    对于每个测试实例,输出在第n年的时候母牛的数量。
    每个输出占一行。

    样例输入

    2
    4
    5
    0
    

    样例输出

    2
    4
    6
    
  • 第一次 AC 50%

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	int n;
    	while(cin>>n)
    	{
    		int sum=0;
    		
    		if(n==0)
    			return 0;
    		for(int i=1;i<=n;i++)
    		{
    			if(i<=4)
    				sum+=1;
    			else 
    				sum+=i-3;
    		}
    		
    		cout<<sum<<endl;
    	}
    	
    	return 0;
    }
    

    枚举了前几个数,找的规律是错的

  • 第二次 AC 50% + 超时 50%

    #include<bits/stdc++.h>
    using namespace std;
    
    int f(int n)
    {
    	if(n<=4)
    		return n;
    	return f(n-2)+f(n-3)+f(n-4);
    }
    
    int main()
    {
    	int n;
    	while(scanf("%d",&n))
    	{
    		if(n==0)
    			return 0;
    		
    		cout<<f(n)<<endl;
    	}
    	
    	return 0;
    }
    

    递归+规律,第二次递归的规律又找错了

  • 第三次 AC 50% + 50% 超时

    #include<bits/stdc++.h>
    using namespace std;
    
    int f(int n)
    {
    	if(n<4)
    		return n;
    	return f(n-1)+f(n-3);
    }
    
    int main()
    {
    	int n;
    	while(scanf("%d",&n)&&n)  //记住这个,当输入0时,跳出循环
    	{
    		cout<<f(n)<<endl;
    	}
    	
    	return 0;
    }
    

    这次 规律对,但还是 超时

  • 第四次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	int n;
    	while(scanf("%d",&n)&&n)
    	{
    		int a[60];
    		a[1]=1,a[2]=2,a[3]=3;
    		
    		for(int i=4;i<=n;i++)  //使用数组递归
    		{
    			a[i]=a[i-1]+a[i-3];
    		}
    		
    		cout<<a[n]<<endl;
    	}
    	
    	return 0;
    }
    
  • 反思

    找规律的题:

    ​ 不要局限在前后相邻的数,不要只找一组,就直接把规律定下来,多找几组

    找规律题中+递归,一开始根本没有往这方面想

    How

    1. 找规律,发散思维,很有可能有递归,看看前后几个数之间的关系
    2. 递归函数,可能会超时,考试的时候,就直接使用 数组来代替函数

2.魔板

  • 题目

    链接: 魔板 - C语言网 (dotcpp.com)

    在魔方风靡全球之后不久,Rubik先生发明了它的简化版――魔板。魔板 由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方 向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:
    1 2 3 4
    8 7 6 5
    对于魔板,可施加三种不同的操作,具体操作方法如下:
    A: 上下两行互换,如上图可变换为状态87654321
    B: 每行同时循环右移一格,如上图可变换为41236785
    C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
    给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。

    输入格式

    每组测试数据包括两行,分别代表魔板的初态与目态。

    输出格式

    对每组测试数据输出满足题意的变换步骤。

    样例输入

    12345678
    17245368
    12345678
    82754631
    

    样例输出

    C
    AC
    
  • 第一次 AC 0%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1010;
    int d[N];
    
    string FA(string a)
    {
    	string b=a;
    		
    	a[0]=b[4],a[1]=b[5],a[2]=b[6],a[3]=b[7];
    	a[4]=b[0],a[5]=b[1],a[6]=b[2],a[7]=b[3];
    	
    	return a;
    }
    
    string FB(string a)
    {
    	string b=a;
    		
    	a[0]=b[3],a[1]=b[0],a[2]=b[1],a[3]=b[2],a[4]=b[6];
    	a[5]=b[5],a[6]=b[4],a[7]=b[7];
    	
    	return a;
    }
    
    string FC(string a)
    {
    	
    	string b=a;
    		
    	a[0]=b[0],a[1]=b[5],a[2]=b[1],a[3]=b[3];
    	a[4]=b[4],a[5]=b[6],a[6]=b[2],a[7]=b[7];
    	
    	return a;
    }
    void bfs(string st,string over)
    {
    	queue<string> q;
    	q.push(st);
    	
    	unordered_map<string,string> mp;
    	
    	while(q.size())
    	{
    		auto now=q.front();
    		q.pop();
    		
    		if(now==over)
    		{
    			cout<<mp[now]<<endl;
    			return ;
    		}
    		
    		string ss;
    		for(int i=1;i<=3;i++)
    		{
    			switch(i)
    			{
    				case 1:
    					ss=FA(now);
    					if(!mp.count(ss))
    					{
    						q.push(ss);
    						mp[ss]=mp[now]+'A';
    					}
    					break;
    				case 2:
    					ss=FB(now);
    					if(!mp.count(ss))
    					{
    						q.push(ss);
    						mp[ss]=mp[now]+'B';
    					}
    					break;
    				case 3:
    					ss=FB(now);
    					if(!mp.count(ss))
    					{
    						q.push(ss);
    						mp[ss]=mp[now]+'C';
    					}
    					break;
    			}
    		}
    	}
    	
    }
    
    int main()
    {
    	string a,b;
    	while(cin>>a>>b)
    	{
    		bfs(a,b);
    	}
    	
    	return 0;
    }
    

    一开始,框架都写出来,但是输出 转换的路径写不出来,忘记咋写了

    好像是倒推,前几天写过,题解中的是用的 STL 里面的 map

    哪里出错了,还没有看出来,他没有输出

  • 题解

    #include<bits/stdc++.h>
    using namespace std;
    // 定义两个变量s和f,代表起点状态和终点状态,其值由输入读入
    string s, f;
    // 操作A函数,将输入状态x按照操作A的规则进行变换
    string A(string x) {
        string s = x;
        for (int i = 0; i < 4; i++) {
            swap(s[i], x[7 - i]);
            swap(s[i + 4], x[3 - i]);
        }
        return s;
    }
    // 操作B函数,将输入状态x按照操作B的规则进行变换
    string B(string x) {
        string s = x;
        s[0] = x[3], s[1] = x[0];
        s[2] = x[1], s[3] = x[2];
        s[4] = x[5], s[5] = x[6];
        s[6] = x[7], s[7] = x[4];
        return s;
    }
    // 操作C函数,将输入状态x按照操作C的规则进行变换
    string C(string x) {
        string s = x;
        s[1] = x[6], s[2] = x[1];
        s[5] = x[2], s[6] = x[5];
        return s;
    }
    // 广搜函数,使用map进行去重,记录操作序列
    void bfs() {
        unordered_map<string, string>mp; // 哈希表,用于存储操作序列
        queue<string>q; // 队列,用于存储待搜索状态
        q.push(s); // 将初始状态入队
        while (!q.empty()) { // 只要队列不为空,就继续搜索
            string now = q.front(); // 取出队首元素
            q.pop(); // 将队首元素出队
            if (now == f) { // 当达到终点状态,输出操作序列
                cout << mp[now] << endl;
                return; // 搜索结束
            }
            string ts; // 操作后的状态
            // 按照题目要求,A、B、C操作依次搜索,保证字典序最小
            for (int i = 0; i < 3; i++) { // 依次搜索ABC操作,保证字典序最小
                switch (i) {
                    case 0: // A操作
                        ts = A(now); // 对当前状态进行A操作
                        if (!mp.count(ts)) { // 如果操作后的状态不在哈希表中
                            q.push(ts); // 将操作后的状态入队
                            mp[ts] = mp[now] + 'A'; // 更新哈希表,存储操作序列
                        }
                        break;
                    case 1: // B操作
                        ts = B(now); // 对当前状态进行B操作
                        if (!mp.count(ts)) { // 如果操作后的状态不在哈希表中
                            q.push(ts); // 将操作后的状态入队
                            mp[ts] = mp[now] + 'B';// 更新哈希表,存储操作序列
                        }
                        break;
                    case 2://C操作
                        ts = C(now); // 对当前状态进行B操作
                        if (!mp.count(ts)) { // 如果操作后的状态不在哈希表中
                            q.push(ts); // 将操作后的状态入队
                            mp[ts] = mp[now] + 'C';// 更新哈希表,存储操作序列
                        }
                        break;
                }
            }
        }
    }
    int main() {
        while (cin >> s >> f) {
            bfs();
        }
        return 0;
    }
    
  • 反思

    通过三种不同的转化状态+最少变化步骤,我们可以确定是 BFS

    对于我来说,这个题的难点不在于确定最少的步数是多少,而是输出路径

    1. 学到了使用 switch 执行不同的函数,我差点就使用函数数组了TvT

    2. 借助了 map 去重+输出路径,学到了

    之前我以为路径都必须倒推,很麻烦,map 真的好用

    我们再研究一下,路径的记录,再刷一两道题这个类型的题

Alt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序+爬虫制作一个表情包小程序

跟朋友聊天斗图失败气急败坏的我选择直接制作一个爬虫表情包小程序&#xff0c;从源头解决问题&#xff0c;从此再也不用担心在斗图中落入下风 精彩专栏持续更新↓↓↓ 微信小程序实战开发专栏 一、API1.1 项目创建1.2 图片爬虫帮助类1.3 测试窗体1.4 接口封装二、小程序2.1 项…

【iOS】GCD再学

文章目录前言GCD概要什么是GCD多线程编程GCD的APIDispatch Queuedispatch_queue_createMain Dispatch Queue/Global Dispatch Queuedispatch_set_target_queuedispatch_afterDispatch Groupdispatch_barrier_asyncdispatch_syncdispatch_applydispatch_suspend/dispatch_resume…

网络安全 2023 年为什么如此吃香?事实原来是这样....

前言由于我国网络安全起步晚&#xff0c;所以现在网络安全工程师十分紧缺。俗话说:没有网络安全就没有国家安全为什么选择网络安全&#xff1f;十四五发展规划建议明确提出建设网络强国&#xff0c;全面加强网络安全保障体系和能力建设&#xff0c;加强网络文明建设&#xff0c…

多线程(三):Thread 类的基本属性

上一个篇章浅浅了解了一下 线程的概念&#xff0c;进程与线程的区别&#xff0c;如何实现多线程编程。 而且上一章提到一个重要的面试点&#xff1a; start 方法和 run 方法的区别。 start 方法是从系统那里创建一个新的线程&#xff0c;这个线程会自动调用内部的run 方法&…

瑟瑟发抖吧~OpenAI刚刚推出王炸——引入ChatGPT插件,开启AI新生态

5分钟学会使用ChatGPT 插件&#xff08;ChatGPT plugins&#xff09;——ChatGPT生态建设的开端ChatGPT插件是什么OpenAI最新官方blog资料表示&#xff0c;已经在ChatGPT中实现了对插件的初步支持。插件是专门为以安全为核心原则的语言模型设计的工具&#xff0c;可帮助ChatGPT…

JSON 教程导读

JSON 教程导读在开始深入了解JSON知识之前&#xff0c;让我们先了解什么是JSON&#xff01;JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法&#xff0c;类似 XML。JSON 比 XML 更小、更快&#xff0c;更易解析。JSON实例&#xff1…

CODESYS增量式PID功能块(ST完整源代码)

增量式PID的详细算法公式和博途源代码,请参看下面的文章链接: 博途1200/1500PLC增量式PID算法(详细SCL代码)_博图scl语言pid增量编码器_RXXW_Dor的博客-CSDN博客SMART200PLC增量式PID可以参看下面这篇博文,文章里有完整的增量式PID算法公式,这里不在赘述西门子SMARTPLC增量…

你值得拥有——流星雨下的告白(Python实现)

目录1 前言2 霍金说移民外太空3 浪漫的流星雨展示 4 Python代码 1 前言我们先给个小故事&#xff0c;提一下大家兴趣&#xff1b;然后我给出论据&#xff0c;得出结论。最后再浪漫的流星雨表白代码奉上&#xff0c;还有我自创的一首诗。开始啦&#xff1a;2 霍金说移民外太空霍…

你的应用太慢了,给我司带来了巨额损失,该怎么办

记得很久之前看过谷歌官方有这么样的声明&#xff1a;如果一个页面的加载时间从 1 秒增加到3 秒&#xff0c;那么用户跳出的概率将增加 32%。 但是早在 2012 年&#xff0c;亚马逊就计算出了&#xff0c;页面加载速度一旦下降一秒钟&#xff0c;每年就会损失 16 亿美元的销售额…

杨辉三角形 (蓝桥杯) JAVA

目录题目描述&#xff1a;暴力破解&#xff08;四成&#xff09;&#xff1a;二分法破解&#xff08;满分&#xff09;&#xff1a;题目描述&#xff1a; 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如…

如何编写测试用例?

带着问题学习是最高效的学习方法。 因此&#xff0c;在介绍如何编写测试用例之前&#xff0c;先看一个软件系统登录功能的测试&#xff08;如下截图所示&#xff09;&#xff1a; 要做这个登录页面的测试用例&#xff0c;你会从哪些方面思考进行测试呢&#xff1f; 看似简单的…

【C语言蓝桥杯每日一题】—— 货物摆放

【C语言蓝桥杯每日一题】—— 货物摆放&#x1f60e;前言&#x1f64c;排序&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介…

图话第一代女性开发者

写在前面的话想问大家一个有趣的问题&#xff0c;大家知道我们程序员圈的第一位女性开发者是谁吗&#xff1f;作为开发者&#xff0c;以前并没有认真去想过这个问题&#xff0c;这两天认真的看了一下百度百科查找了一下相关的专业知识。才知道历史上第一位女性程序员是&#xf…

docker+jenkins+maven+git构建聚合项目,实现自动化部署,走了800个坑

流程 主要的逻辑就是Docker上安装jenkins&#xff0c;然后拉取git上的代码&#xff0c;把git上的代码用Maven打包成jar包&#xff0c;然后在docker运行 这个流程上的难点 一个是聚合项目有可能Maven install的时候失败。 解决办法&#xff1a;在基础模块的pom文件上添加 <…

重谈“协议” + 序列化和反序列化

目录 1、重谈 "协议" 协议的概念 结构化数据的传输 序列化和反序列化 2、网络版计算器 2.1、服务端serverTcp.cc文件 服务端serverTcp.cc总代码 2.2、客户端clientTcp.cc文件 客户端clientTcp.cc总代码 2.3、协议定制Protocol.hpp文件 服务端需要的协议 客户端需要…

惠普官网驱动程序与软件下载,如何安装打印机驱动

惠普&#xff08;HP&#xff09;是一家全球知名的计算机硬件制造商&#xff0c;其产品涵盖台式电脑、笔记本电脑、打印机、扫描仪等。为了保证产品的正常运行和最佳性能&#xff0c;惠普为其设备提供了驱动程序和软件的下载服务。本文将介绍如何在惠普官网下载所需的驱动程序和…

【Linux】 基础IO——文件(中)

文章目录1. 文件描述符为什么从3开始使用&#xff1f;2. 文件描述符本质理解3. 如何理解Linux下的一切皆文件&#xff1f;4. FILE是什么&#xff0c;谁提供&#xff1f;和内核的struct有关系么&#xff1f;证明struct FILE结构体中存在文件描述符fd5. 重定向的本质输出重定向输…

Linux基础

环境搭建&#xff1a;linux安装、远程连接常用命令&#xff1a;文件、目录、拷贝、移动、打包、压缩、文本编辑安装软件&#xff1a;文件上传、jdk、tomcat、mysql项目部署&#xff1a;Java应用、Python应用、日志查看、系统管理、用户权限Linux是一套免费使用、自由传播的操作…

ngx之日志切割

正确记日志方式是每天都进行切割重新写&#xff0c;保留固定的时间后可使用 find 删除。 用系统自带有的 logrotate /etc/logrotate.d 下面再建立一个文件&#xff0c;这里是nginx &#xff08; 中途有 ctrlZ 暂停过任务&#xff0c;后面fg恢复的 &#xff09; /usr/local/ng…

不同类型的电机的工作原理和控制方法汇总

电机控制是指对电机的启动、调速&#xff08;加速、减速&#xff09;、运转方向和停止进行的控制&#xff0c;不同类型的电机有着不同的工作原理和控制方法。 一、无刷电机 无刷电机是由电机主体和电机驱动板组成的一种没有电刷和换向器的机电一体化产品。在无刷电机中&#xf…