汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
上述这些是百度来的题目简介orz,接下来才是正文。
当有一个碟子的时候,直接从棍子A移动到棍子C,调用一个move()函数就很方便了。
当出现了两个碟子时,就需要考虑到题设中给出的“小圆盘上不能放大圆盘且一次只能移动一个圆盘”这个条件。
如果先把小圆盘放在最终目的“棍”上,迟早还要为了把大圆盘放上去而挪走,因此最先放在棍C上的圆盘必定是最大圆盘,小圆盘只能先“委屈”在中间棍B上了,待会再把它挪走。(上:小圆盘,下:最大圆盘)
到了这里就可以用到递归啦,见微知著,小圆盘可以看做是许多个小圆盘从小到大排下来的集合,大圆盘一直是最先要放在C上节省步骤的最大圆盘。
可是小圆盘们不可能在“一次只能移动一个圆盘”的条件下一股脑都移动到中间棍B上,必须借助棍C的帮助才可以,小圆盘们全部移动到棍B上,空出了一个棍A作为后续步骤的中间棍。(字可能描述的有些复杂,看图就好)
至此,小圆盘们已经全部移动到棍C上啦!Congratulation!以上都是逻辑表述,下面附上代码表述。
#include<iostream>
void main()
{
int m;
void hanoi(char x,char y,char z,int n);
void move(char x,char y);
std::cout<<"Input the number of disks:";
std::cin>>m;
std::cout<<"The steps of moving disks:\n";
hanoi('A','B','C',m);
}
void hanoi(char x,char y,char z,int n)
{
void move(char x,char y);
if(n==1)
move(x,z);//一个圆盘时一步到位
else
{
hanoi(x,z,y,n-1);//(n-1)个圆盘从棍x到棍y,经由了棍z的帮助
move(x,z);
hanoi(y,x,z,n-1);//(n-1)个圆盘从棍y到棍z,经由了棍x的帮助
}
}
void move(char x,char y)
{
std::cout<<x<<"->"<<y<<std::endl;//显示出来给大家看步骤的
}
下面是程序运行的结果:
n=1:
n=2:
n=3:
继续学习!继续加油!