汉诺塔(河内塔)问题
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
下图分析了黄金圆盘数目分别为1、2、3时的情况,可通过其观察移动的一般规律。
图片来源:http://www.chiuchang.com.tw/toy/hanoi/hanoi.html
通过分析可知,题目要求是将所有圆盘最终从A号柱移动到C号柱,对于问题规模为n的情况,可将问题分解为三步:
1.将顶上的n-1个黄金圆盘从A号柱通过C号柱移动到B号柱上。
2.将A号柱子上的最后一个圆盘移动到C号柱上。
3.将B号柱上的n-1个圆盘通过A移动到C号柱上。
有此可知该问题可以用一递归的思想来解决,实现代码如下:
//汉诺塔问题,递归
//时间复杂度,设有n个盘 f(n) = 2f(n-1)+1 = 4f(n-2) + 2 + 1 = pow(2, n-1) + pow(2, n-2) + `````+ 4 + 2 + 1
//等积数列 可知最后 f(n) = pow(2, n)-1;
#include <iostream>
using namespace std;
int g_nTimesUsed = 0;
void Hanoi(int nDisk, char A, char B, char C)
{
if (nDisk == 1)
{
cout<<"moved the "<<nDisk<< " Disk from "<<A <<" to "<<C<<endl;
g_nTimesUsed++;
return;
}
else
{
Hanoi(nDisk-1, A, C, B);
cout<<"moved the "<<nDisk<< " Disk from "<<A <<" to "<<C<<endl;
g_nTimesUsed++;
Hanoi(nDisk-1, B,A, C);
}
}
int main()
{
int nBow = 0;
cout<<"输入塔A上的盘数目"<<endl;
cin>>nBow;
Hanoi(nBow, 'A','B','C');
cout<<endl<<"used "<<g_nTimesUsed<<" times"<<endl;
system("pause");
}
本系列(趣味算法系列)内的部分问题题目来自:经典算法大全 老奔整理 Email: ben0133@163.com
汉诺塔(河内塔)问题相关推荐
- 汉诺塔//河内塔(Tower of Hanoi)
#汉诺塔//河内塔(Tower of Hanoi) #include<#iostream> using namespace std; static int index = 0; void ...
- 2016年圣诞节巨献:C#汉诺塔河内塔游戏(动画、圣诞节音效)源码及安装包
终于把VS的的打包搞定了,高兴啊! 圣诞节巨献:C#汉诺塔河内塔游戏(动画效果.圣诞节音效).在平庸而又乏味的生活中,来一把紧张而刺激的汉诺塔游戏,生活,就是这么美好.游戏代码可以在博主的资源页下载! ...
- 汉诺塔(河内塔)问题(递归)
Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说.开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A.B和C,A上面套着 n 个圆的金片,最大的一个在底下,其余一个比一个小,依次 ...
- 【码蹄集】四柱河内塔
题目:四柱河内塔 河内塔问题: 有三个柱子,编号为1,2,3;在编号为1的柱子上有n个大小不同圆盘,圆盘从小到大,从上到下堆叠,你只可以移动-个柱子上最上面的圆盘. 现在你需要将编号为1的柱子上的圆盘 ...
- 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
import java.math.BigInteger; /* * 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序 ...
- “三色河内塔”算法(三色汉诺塔)
问题引入 "三色河内塔"由"河内之塔"的规则衍生而来(点击查看),区别在于三色河内塔的目的是将图1所示的圆盘位置,移动成为图2所示的圆盘位置."三色河 ...
- C语言递归算法——汉诺塔问题(河内塔)
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- C#之汉诺塔(河内塔)递归问题
C#之汉诺塔(河内塔)递归问题 前言 一.汉诺塔问题 二.问题思考 1.简单定义一下 2.假设简单的情况 3.推广 4.核心代码 总结 前言 小时候在直板手机上玩过这么一款叫做"汉诺塔&qu ...
- C++汉诺塔问题(河内塔)
C++汉诺塔问题(河内塔) 这是一个非常经典的递归问题. 递归:在函数内部又再次调用函数自身的问题 假设有n个盘子,需要把这些盘子从第一根起始柱A移动到第三根目标柱C中. 1.首先需要把n-1个盘子移 ...
最新文章
- “四非”高校南京工业大学,17天内三连击Nature、Science!实为深藏不露
- BeagleBone Black快速入门教程
- ServiceStack.Redis常用操作 - 事务、并发锁
- Asp.net系列计划
- Go 语言的%d,%p,%v等占位符的使用
- 阿里开源的Arthas竟然还不会用?最佳实践来了!
- LiveVideoStack线上交流分享 (十) —— 开源声码器WORLD在语音合成中的应用
- 最短路和次短路问题,dijkstra算法
- 《炉石传说》建筑设计欣赏(7):采用Google.ProtocolBuffers处理网络消息
- hive 常用UDF
- One-hot encoding 独热编码
- 零配置简单搭建SpringMVC 项目
- deploy mysql_Deploy Mysql
- 文字图片转换成html代码,IMG4Me 网站在线把文字转换为图片
- 系统服务器属于无形资产,企业管理系统是否属于无形资产?
- 【阿里102句土话集锦】菜鸟必备
- android mac 照片恢复,照片恢复
- 小米 MIX4 发布、三年要拿下全球第一、还有一只 9999 元的狗?快看 3 个小时雷军都讲了什么!...
- xiaopiu怎么导出html,聊聊xiaopiu那些鲜为人知的惊喜功能(进阶篇)
- Linux 搭建Owncloud 私有云