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

该题在蓝桥杯基础数据结构篇,进入后搜索题号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.hqwc.cn/news/467262.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux--目录结构

目录 一、Linux的目录结构二、常用的目录介绍 一、Linux的目录结构 Linux的目录结构是一个树型结构。 Windos 系统可以拥有多个盘符&#xff0c;如C盘&#xff0c;D盘,E盘。 Linux 木有盘符这个概念&#xff0c;只有一个根目录 /&#xff08;相当于文件夹&#xff09;&#xf…

Java中抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题)。 核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写而重写抽象方法), 而接口中不能包含普通方法&#xff08;接口…

使用Docker快速部署MySQL

部署MySQL 使用Docker安装&#xff0c;仅仅需要一步即可&#xff0c;在命令行输入下面的命令 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123456 \mysql MySQL安装完毕&#xff01;通过任意客户端工具即可连接到MySQL. 当我们执…

线性代数的本质 1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…

HTTP 超文本传送协议

1 超文本传送协议 HTTP HTTP 是面向事务的 (transaction-oriented) 应用层协议。 使用 TCP 连接进行可靠的传送。 定义了浏览器与万维网服务器通信的格式和规则。 是万维网上能够可靠地交换文件&#xff08;包括文本、声音、图像等各种多媒体文件&#xff09;的重要基础。 H…

vue3中Pinia

一、pinia的简单使用 vuex和pinia的区别 参考网址&#xff1a;[Vuex] Vuex 5 by kiaking Pull Request #271 vuejs/rfcs GitHub 1.pinia没有mutations&#xff0c;只有&#xff1a;state、getters、actions 2.pinia分模块不需要models&#xff08;之前vuex分模块需要models…

LeetCode:67.二进制求和

67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 又是一道求和题&#xff0c;% / 在求和的用途了解了些&#xff0c; 目录 题目&#xff1a; 思路分析&#xff1a; 博主代码: 官方代码&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路分析&#xf…

【电路笔记】-串联电感

串联电感 文章目录 串联电感1、概述2、电感串联示例13、互耦串联电感器4、电感串联示例25、电感串联示例36、总结当电感器以菊花链方式连接在一起并共享公共电流时,它们可以串联连接在一起。 1、概述 这些电感器的互连产生了更复杂的网络,其总电感是各个电感器的组合。 然而…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

软件23-上午题-树与二叉树2

一、平衡二叉树 平衡二叉树&#xff1a;是一棵空树或它的左右两个子树的高度差的绝对值不超过 1&#xff0c; 并且左右两个子树都是一棵平衡二叉树。 注意&#xff1a; 完全二叉树 平衡二叉树&#xff01;&#xff01;&#xff01; 二、二叉排序树&#xff08;二叉查找树、二…

算法-----高精度算法1(高精度加法,高精度减法)(详解)

什么是高精度算法&#xff1f; 高精度的意思就是他得名字----高的精度&#xff0c;简单说就是位数很大&#xff0c;而高精度算法就是将这些高精度数&#xff08;位数很大在几百几千几万位的数叫高精度数&#xff09;通过计算机的型式模拟出来结果。 为什么要用高精度算法&…

坚持刷题|环形链表

文章目录 题目考察点代码实现扩展问题 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;刷了一段时间二叉树啦&#xff0c;今天换链表刷&#xff1a;环形链表 题目 141. 环形链表 考察点 主要考察了链表的基本操作和快慢指…