问题介绍:略
求解方法:
1.递推求解移动次数
(1),当n=1时,只有一个盘,移一次。
当n=2时,先将小盘从A桩移到B桩,然后把大盘从A桩移到C桩,最后把小盘从B桩移到C桩,移3次完成。
设移动n个盘的汉诺塔需要g(n)次完成,则分3个步骤:
1)将n个盘上面的n-1个盘借助C桩从A桩移到B桩,需g(n-1)次;
2)将A桩上第n个盘子移到C桩上(1次);
3)将B桩上的n-1个盘子借助A桩移到C桩上,需g(n-1)次。
因而有递推关系:g(n) = 2*g(n-1)+1
初始条件:g(1) = 1
源代码:
#include<iostream.h>
void main()
{
double m = 1;//确定初始条件
int i , n;
cout<<"请输入盘片数n: ";
cin>>n;
for( i = 2; i <= n; i++)
{
m = m*2 + 1;//在循环中实施递推
}
cout<<"移动次数为: "<<m<<endl;
}
2.递归求解移动过程
设递归函数hanoi(n, a, b, c)展示把n个盘从A桩借助B桩移到C桩的过程,函数move(a, c)输出从a桩到c桩的过程。
当n=1时, 即move(a, c)。
当n > 1 时,分3步:
1)将A桩上面的n-1个盘子借助C桩移到B桩上,即hanoi(n-1, a, c , b).
2)将A桩上第n 个盘子移到C桩上,即move(a, c).
3)将B桩上的n-1个盘子借助A桩移到C桩上,即hanoi(n-1, b, a, c).
源代码:
#include<iostream.h>
int k = 0;
void move(char x, char y)//输出函数
{
cout<<x<<"-->"<<y<<" ";
k++; //统计移动次数
if(k%5 == 0)
{
cout<<"\n";
}
}
void hanoi(int m, char a, char b, char c)//递归函数
{
if(m == 1)
move(a,c);
else
{
hanoi(m-1,a,c,b);
move(a,c);
hanoi(m-1,b,a,c);
}
}
void main()
{
int n;
cout<<"请输入n的值:";
cin>>n;
hanoi(n,'A','B','C');
cout<<k<<endl;
}