汉诺塔是一个益智游戏,就是有三根柱子,然后有一堆圈圈,圈圈有大小之分,大的圈圈必须在小的上面。现在需要做的是将所有的圈圈从1个柱子完全地移动到另外一个柱子上面。
汉诺塔是一个经典的递归问题。
(1) 把n-1个盘子由A 移到 B;(C为过渡盘)
(2) 把第n个盘子由 A移到 C;
(3) 把n-1个盘子由B 移到 C;(A为过渡盘)
void han(int n,char a,char b,char c)
{
if(n==1)//这是递归出口,
{
move(a,c);
}
else //这就是当n>1考虑的情况
{
han(n-1,a,c,b);
move(a,c);
han(n-1,b,a,c);
}
}
void move(char a,char b)//定义私有化成员函数,只允许本类成员调用
{
cout<<"由"<<a<<"-->"<<b<<endl;
}
han(3,'a','b','c')
当n=1只需要将第一个位置和第三个位置移动就行了,这里是递归的出口。然后剩下的按照递归的规律去进行就好了。
上面是3个数量的圈圈在a柱子上面完全移动到c柱子上面的运行结果。即使数量提升了也没关系,我们只需要把han(3,'a','b','c')中的3改为圈圈的数量就行,然后再按照计算机运行的结果做一次,那就可以移动出来。
欢迎和我讨论有关程序的问题,也可以答疑。关注公众号:诗一样的代码,交一个朋友。