汉诺塔移动
Q:什么是汉诺塔问题
A:有三根柱子,任意数量的圆片从上到下(从小到大)叠放在第一根柱子上借助中间一根柱子,在一次只能移动一个的情况下,将左边的圆片全部移动到右边(注:大的圆片不能排放在比他小的圆片上方)
解决方案
可以通过递归来进行计算和打印移动的步骤,通过返回值来得到移动的步数
//主函数部分
int main()
{
//n表示汉诺塔的层数 sum获得n层汉诺塔移动需要的步数
int n=4;
int sum=0;
//将三根柱子分别用X,Y,Z三个字符表示
sum = test4(n,'x','y','z');
cout << sum << endl;
return 0;
}
int test4(int n,char x,char y,char z)
{
if(n == 1)
{
//打印移动过程
cout << x << "------->" << z <<endl;
return 1;
}
else
{
//解题思路
//第一步先把n-1个从X移动到y
//第二步把剩下的第n个从X移动到Z
//第三步将n-1个从Y移动到Z上
//然后重复上述3个步骤
// test4(n-1,x,z,y);
// test4(1,x,y,z);
// test4(n-1,y,x,z);
return test4(n-1,x,z,y)+test4(1,x,y,z)+test4(n-1,y,x,z);
}
}