经典问题之汉诺塔
程序员文章站
2022-04-13 15:43:59
...
问题描述:
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
思路:
以3层的汉诺塔为例:
1、我们可以先将上面两个盘子,借助Z柱移动到Y柱
2、将最后一个盘子移动到Z柱
3、将Y柱的两个盘子,借助X柱移动到Z柱
一切搬圆盘都是在重复上面三个步骤,因此,这三步便是一个递归体,我们可以采用递归的方式实现,至于它到底怎么移动的,我们并不需要知道。
代码实现:
#include <iostream>
using namespace std;
int count = 0;
//将 n 个盘子从 x 借助 y 移动到 z
int move(int n,char x,char y,char z)
{
if(1 == n){
count++; //将最下面的盘子,从x移动到z
cout << x << "->" << z << endl;
}
else{
move(n-1, x, z, y); //将n-1个盘子,借助z从x移动到y
cout << x << "->" << z << endl;
move(n-1, y, x, z); //将n-1个盘子,借助x从y移动到z
count++;
}
return count;
}
int main()
{
int n;
cout << "请输入汉诺塔层数:";
cin >> n;
move(n,'X','Y','Z'); // X,Y,Z分别表示3个柱子
cout << "共需要移动:" << count << "次" << endl;
return 0;
}
结果:
上一篇: 汉诺塔问题
推荐阅读
-
【C++深度剖析教程15】经典问题解析之关于string的疑问
-
用python实现汉诺塔问题
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理
-
Go语言实现汉诺塔算法
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理
-
c#实现汉诺塔问题示例
-
JAVA数据结构之汉诺塔代码实例
-
Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】
-
java 汉诺塔Hanoi递归、非递归(仿系统递归)和非递归规律 实现代码
-
c#汉诺塔的递归算法与解析