蓝桥杯题目解析 --汉诺塔(含C++栈的知识)

news2025/1/21 13:02:05

该题在蓝桥杯基础数据结构篇,进入后搜索题号1512。

汉诺塔

可以将圆盘临时置于B杆,也可以将A杆移除的圆盘重新移回A杆,但必须遵循上述两条规则。

汉诺塔了解后,题目也了解后,我们先通过试N的个数来找规律:

当N=1时: A—>C; 移动一次

当N=2时: A—>B ; A—>C ; B—>C ; 移动三次

当N=3时:A—>C ; A—>B ; C—>B ; A—>C ; B—>A ; B—>C ; A—>C ; 移动七次

我们可以发现圆盘移动是有规律的:

1.把n-1个圆盘由A移到B;
2.把第n个圆盘由A移到C;    -----最大的那个先放到C最底面
3.把n-1个圆盘由B移到C;

我们把n-1个圆盘看成一个整体去分析:

那如何把n-1个圆盘从A移到B呢?借助C塔移到了B上

我们可以把n-2个圆盘看成一个整体去分析:
1.把n-2个圆盘由A移到C;
2.把第n-1个圆盘由A移到B;  -----这又是最大的,要注意了,这是很明显的递归
3.把n-2个圆盘由C移到B;

那如何把n-1个圆盘从B移到C呢?借助A塔移到了C上

1.把n-2个圆盘由B移到A;
2.把第n-1个圆盘由B移到C;  -----这还是最大的
3.把n-2个圆盘由A移到C;

接下来是递归写法的代码:    ---这里并不是题目的答案,只是汉诺塔的代码

#include<bits/stdc++.h>
using namespace std;
void hanoi(char a,char b,char c,int n){
    if (n==1) cout<<a<<" -> "<<c<<endl;  //直接移动到C柱,输出 
    else {
        hanoi(a,c,b,n-1);  //把上面n-1个移到B柱
        cout<<a<<" -> "<<c<<endl;  //输出
        hanoi(b,a,c,n-1);  //把剩下n-1个从B柱移到C柱
    }
}
int main(){
    int n;
    cin>>n;
    hanoi('A','B','C',n);
}

回到题目中来,题目中多了一个最少移动步数的第M步,加个判断条件就行:

 1 #include <iostream>
using namespace std;

int sum = 0 , m;
void hanoi(char a , char b , char c , int n)
{
  if(n == 1)
  {
    sum++;
    if(sum == m)
    {
      cout << "#" << n << ":"  << " " << a << "->" << c << endl;
    }
  }else{
    hanoi(a , c , b , n-1);
    sum++;
    if(sum == m)
    {
      cout << "#" << n << ":" << " " << a << "->" << c << endl;
    }
    hanoi(b , a , c , n-1);
  }
}
int main()
{
  // 请在此输入您的代码
  int n;
  cin >> n >> m;
  hanoi('A' , 'B' , 'C' ,n);
  cout << sum << endl;
  return 0;
}

C++栈的知识

在C++程序中需要使用栈时,直接用STL stack或者自己编写栈。

手写栈:

因为手写栈非常简单,所以自己编写一个栈并不比用STL stack慢。

 1  const int N = 100100;                     //定义栈的大小
 2  struct mystack{
 3      int a[N];                             //存放栈元素
 4      int t = -1;                           //栈顶位置
 5      void push(int x){ a[++t] = x; }       //入栈
 6      int top()       { return a[t]; }      //读栈顶元素,不弹出
 7      void pop()       { t--;         }     //弹出栈顶元素
 8      int empty()      { return t==0?1:0;}  //返回1表示栈为空
 9  };

STL stack的有关操作如下。

stack<Type> s:定义栈,Type为数据类型,如int、float、char等。

s.push(item) :把item放到栈顶。

s.top():返回栈顶元素,但不将其删除。

s.pop():删除栈顶元素,但不会返回。出栈需要进行两步操作:先获得栈顶元素,再删除栈顶元素。

s.size():返回栈中元素的个数。

s.empty():检查栈是否为空,如果为空则返回True,否则返回False。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 10.0 锁屏壁纸 LockscreenWallpaper

前言 一、设置壁纸 通过系统设置进行锁屏壁纸和桌面壁纸的设置。 Setting 部分的代码&#xff1a; packages/apps/WallpaperPicker2/src/com/android/wallpaper/module/DefaultWallpaperPersister.java private int setStreamToWallpaperManagerCompat(InputStream inputStre…

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

【C语言进阶】深度剖析数据在内存中的存储--上

1. C语言中的数据类型的简单介绍 注&#xff1a;C99标准里面&#xff0c;定义了bool类型变量。这时&#xff0c;只要引入头文件stdbool.h &#xff0c;就能在C语言里面正常使用bool类型。 1.1 在C语言中各类型所占内存空间的大小如下 char类型的数据类型大小为1字节即8比特位。…

爬爬爬——今天是浏览器窗口切换和给所选人打钩(自动化)

学习爬虫路还很长&#xff0c;第一阶段花了好多天了&#xff0c;还在底层&#xff0c;虽然不是我专业要学习的语言&#xff0c;和必备的知识&#xff0c;但是我感觉还挺有意思的。加油&#xff0c;这两天把建模和ai也不学了&#xff0c;唉过年了懒了&#xff01; 加油坚持就是…

16 亚稳态原理和解决方案

1. 亚稳态原理 亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。在同步系统中&#xff0c;输入总是与时钟同步&#xff0c;因此寄存器的setup time和hold time是满足的&#xff0c;一般情况下是不会发生亚稳态情况的。在异步信号采集中&#xff0c;由于异步…

MySQL篇----第二十二篇

系列文章目录 文章目录 系列文章目录前言一、什么是表级锁二、什么是页级锁三、什么是行级锁四、什么是悲观锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

2023-12蓝桥杯STEMA 考试 Python 中高级试卷解析

蓝桥杯STEMA 考试 Python 中高级试卷&#xff08;12 月&#xff09; 一、选择题 第一题 以下哪项是取余运算符&#xff1f;&#xff08; C &#xff09; A、* B、// C、% D、 第二题 已知&#xff1a;s "python"&#xff0c;执行 print(s[::2])语句后&…

【Java程序设计】【C00265】基于Springboot的地方废物回收机制管理系统(有论文)

基于Springboot的地方废物回收机制管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的地方废物回收机构管理系统 本系统分为管理员功能模块以及员工功能模块。 管理员功能模块&#xff1a;管理员登录系统后…

使用matplotlib库来绘制柱状图

# coding: utf-8 from matplotlib import pyplot as plt from matplotlib import font_manager# 定义区间和宽度列表 interval [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90] width [5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60] # 定义数量列表 quantity [836, 2737, 3723, …

【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、RasterLite2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、RasterLite2介绍 RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基…

【程序设计竞赛】C++与Java的细节优化

必须强调下&#xff0c;以下的任意一种优化&#xff0c;都应该是在本身采用的算法没有任何问题情况下的“锦上添花”&#xff0c;而不是“雪中送炭”。 如果下面的说法存在误导&#xff0c;请专业大佬评论指正 读写优化 C读写优化——解除流绑定 在ACM里&#xff0c;经常出现…

基于Qt的人脸识别项目(功能:颜值检测,口罩检测,表情检测,性别检测,年龄预测等)

完整代码链接在文章末尾 效果展示 代码讲解(待更新) qt图片文件上传 #include <QtWidgets> #include <QFileDialog>

普通男孩的新年创作纪念日

前言 首先在新春佳节&#xff0c;小编在这里祝各位大佬。萌新友友们新年好&#xff0c;希望每一个烟火般的你在新的一年里 offer 多多&#xff0c;薪资多多 &#xff0c;龙行龘龘 &#x1f409; &#x1f409; &#x1f409; &#x1f409;&#xff0c;前程朤朤 ❤️ ❤️ ❤…

Ps:堆栈模式在摄影后期的应用

Photoshop 的堆栈模式 Stack Mode为摄影师提供了一种强大的后期处理能力&#xff0c;通过堆叠和处理多张照片来实现无法单靠一张照片完成的效果。 正确的前期拍摄策略和后期处理技巧可以显著提高最终图像的质量和视觉冲击力。 ◆ ◆ ◆ 前期拍摄通用注意事项 在前期拍摄时&am…

【排序】快速排序

基本思想 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所…

视频讲解:优化柱状图

你好&#xff0c;我是郭震 AI数据可视化 第三集&#xff1a;美化柱状图&#xff0c;完整视频如下所示&#xff1a; 美化后效果前后对比&#xff0c;前&#xff1a; 后&#xff1a; 附完整案例源码&#xff1a; util.py文件 import platformdef get_os():os_name platform.syst…

STM32 寄存器操作 GPIO 与中断

一、如何使用stm32寄存器点灯&#xff1f; 1.1 寄存器映射表 寄存器本质就是一个开关&#xff0c;当我们把芯片寄存器配置指定的状态时即可使用芯片的硬件能力。 寄存器映射表则是开关的地址说明。对于我们希望点亮 GPIO_B 的一个灯来说&#xff0c;需要关注以下的两个寄存器…

Linux---网络套接字

端口号 端口号 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 端口号能够标识网络上的某一台主机的某一个进程; 一个端口号只能被一个进程占用 在公网上&#xff0c;IP地址能表示唯一的一台主机&…

大模型激活函数知识

FFN块 计算公式 在Transformer模型中&#xff0c;FFN&#xff08;Feed-Forward Network&#xff09;块通常指的是在编码器&#xff08;Encoder&#xff09;和解码器&#xff08;Decoder&#xff09;中的一个全连接前馈网络子结构。FFN块位于自注意力层&#xff08;Self-Attent…