1. 首先要知道:对于n个盘子的汉诺塔,最少的移动次数为(2^n-1),在移动过程中会出现2的n次方种不同状态。
  2. 例题一:

题目描述:
n个盘子的汉诺塔问题的最少移动次数是2^/n-1,即在移动过程中会产生2的n次方个系列。由于
发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱
子从下往上的大小仍保持如下关系 :
n=m+p+q
a1>a2>…>am
b1>b2>…>bp
c1>c2>…>cq
计算所有会产生的系列总数.


Input:
包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数
目N<30.
3
1
3
29


Output:
对于每组数据,输出移动过程中所有会产生的系列总数。
3
27
68630377364883

  • 思考:对一个n个盘子的整体来说,有3种状态;将(n-1)个取出,跟最大的一个盘子会有3x2种状态;再将(n-2)个继续取出,跟剩余的两个会有3x3x2种状态……以此类推,可得如下代码:
#include<iostream>
#include<cmath>
using namespace std;int main()
{int t;cin>>t;while(t--){int n;long long sum=3;cin>>n;for(int i=2;i<=n;i++)sum+=pow(3,i-1)*2;cout<<sum<<endl; }return 0;
}
  1. 例题2:

题目描述:
盘子的数目和其中一个盘子的编号,求该盘子移动的最少次数。


Input:
包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数目N(1<=N<=60)和盘
号k(1<=k<=N)。
2
60 1
3 1


Output:
576460752303423488
4

  • 通过列举,可得出在n个盘子下,编号为k的盘子需要移动的最少次数为2^(n-k)。最明显的例子就是最大的底盘,为2的0次方。这里如果用递归,考虑到有60次,时间消耗将会很大,不合适。代码如下:
#include<iostream>
#include<cmath>
using namespace std;int main()
{int n,t,k;long long result;cin>>n;while(n--){cin>>t>>k;result = pow(2,t-k);cout<<result<<endl;}return 0;
}
  1. 例题3:

问题描述:
现在改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。现在有N个圆盘,至少多少次移动才能把这些圆盘从最左边移到最右边?


Input:
包含多组数据,每次输入一个N值(1<=N=35)。
1
3
12


Output:
对于每组数据,输出移动最小的次数。
2
26
531440

  • 思考:多写几组数据,通过观察规律可发现:移动最少次数恰好等于3^n-1,所以代码如下:
#include<iostream>
#include<cmath>
using namespace std;int main()
{int n;while(cin>>n){long long sum=1;//这里要用long long,不然会溢出while(n--) sum*=3;cout<<sum-1<<endl; }return 0;
}
  1. 例题4:

题目描述:
不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。


Input:
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
2
1
10


Output:
对于每组输入数据,最少需要的摆放次数。
2
19684

  • 通过观察数据可得出最少次数满足3^(n-1)+1的规律,可得如下代码:
#include<iostream>
using namespace std;int main()
{int t;cin>>t;while(t--){int n;cin>>n;long long sum=1;n--;while(n--) sum*=3;cout<<sum+1<<endl;}return 0;
}

汉诺塔问题的总结(1)相关推荐

  1. 汉诺塔(三)_栈的应用

    问题 E: 汉诺塔(三) 时间限制: 3 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...

  2. 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)

    前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...

  3. Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

    1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s== ...

  4. 技术图文:如何实现汉诺塔问题?

    背景 最近在辅导小孩们学习编程,在介绍函数递归时,最典型的就是汉诺塔问题了. 我在这里总结一下,以方便大家的学习. 汉诺塔问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在 ...

  5. 汉诺塔问题---小昝

    C语言 #include <stdio.h> void move(char A,char C){printf("%c ---> %c\n",A,C); }void ...

  6. 轻松理解汉诺塔问题(图解java描述)

    引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...

  7. 栈与队列5——汉诺塔问题(方案二)

    题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法二:非递归法 ...

  8. 栈与队列5——汉诺塔问题

    题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数. 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法一:主要分 ...

  9. 【项目展示】自己用C语言编写的汉诺塔小游戏

    本文目录 1.前言 2.什么是汉诺塔? 3.项目规格 4.基本思路 5.源代码 6.运行结果 7.感想与心得 8.未来规划 1.前言 昨儿个把自己大一时候写过的五子棋重构了一下,之后就在想着要不把不知 ...

  10. 零基础入门学习Python22-递归2 斐波那契数列和汉诺塔

    数学函数 F(n) = 1 n = 1 F(n) = 1 n = 2 F(n) = F(n-1)+F(n-2) n > 2 问n=20时,F(n)的值是多少??? 迭代实现 def F(n):x ...

最新文章

  1. 分享一个 markdown 编辑器 - Mditor
  2. IDC公布中国深度学习市场综合份额:百度超越Facebook位列第二
  3. SpringCloud_RibbonHystrixFeign
  4. mysql8.0远程linux_【Linux】【mysql】mysql8.0开启远程访问及常见问题
  5. 访谈Stuart Davidson:Skyscanner的持续交付推广
  6. access开发精要(3)-子数据表
  7. 【学习笔记】观察者模式
  8. 27.泛型generics.rs
  9. tablueau地图标记圆形_R语言在线地图神器:Leaflet for R包(三) 符号标记
  10. 压缩下载到浏览器的工具类
  11. unity 太阳自发光_这些太阳能概念设计,灵感来自植物!
  12. 181028每日一句
  13. python语言程序设计课后答案王恺_超星学习通Python程序设计基础(山东联盟)答案汇总...
  14. javascript 时间脚本收集
  15. AES对称加密原理及服务
  16. 独孤求败-小滴云架构大课十八式
  17. 电脑不能连接wifi怎么办连不上wifi怎么办
  18. 那些可盐可甜的AI声音,可能都是出自于这家公司
  19. 解析Amazon和Google语音平台之争的商业逻辑
  20. java bubble sort_Java-BubbleSort

热门文章

  1. 马云,你不缺孩子,很多人叫你爸爸
  2. DHT11温湿度传感器学习
  3. 设计模式-单一职责原著
  4. 如何加声调口诀_汉语拼音声调标注口诀
  5. 计算机报名验证码不出现怎么办,电脑显示验证码很慢或验证码显示不出来怎么办...
  6. 使用HTML实现图片切换/轮播
  7. “拖延症”的良方——对于追求完美,自制力差,情绪化的人很受用...
  8. STM32开发环境搭建——Keil5
  9. 电脑浏览器安全获取京东cookie
  10. 程序员的“三十而已”,你都30岁了,职业该如何规划?