引用:http://blog.163.com/j_yy2008/blog/static/172637309201122845125167/
http://www.cnblogs.com/li-peng/p/3303349.html
http://blog.csdn.net/u011131296/article/details/9185481
http://blog.csdn.net/xujinsmile/article/details/8091738 (包含扩展部分,很不错的参考)
代码如下:
#include
using namespace std;
void hanoi(int n,char A,char B,char C);
static int Day = 0; // 用于表示移动盘子所需的天数
int main()
{
int n;
cout << "请输入盘数:";
cin >> n;
hanoi(n,'A','B','C');
cout << "世界末日将在 " << Day << " 天后来临!!!";
cout << endl;
return 0;
}
// 递归函数:将A柱子上N个盘子通过B柱子放到C柱子上
void hanoi(int n,char A,char B,char C)
{
Day += 1;
if(1 == n)
{
cout << "Move sheet " << n << " : " << A << " ---> "<< C << endl;
}
else
{
hanoi(n-1,A,C,B); // 把A柱子上(N-1)个盘子通过C放到B柱子上
cout << "Move sheet " << n << " : " << A << " ---> "<< C << endl;
hanoi(n-1,B,A,C); // 把B柱子上(N-1)个盘子通过A放到C上
}
}
计算移动次数:
如果要计算一共移动了多少次,找出规律即可。
假设移动n个盘子需要移动f(n)次,所以把n-1个盘子移动到b柱子上,需要移动f(n-1)次,然后把第n个盘子移动到c柱子上,需要移动1次,最后把n-1个盘子移动到c柱子上,需要移动f(n-1)次,综上所述,一共移动了
f(n) = 2 f(n-1) + 1
而:
f(1) = 1;
f(2) = 2*1+ 1;
f(3) = 2(2*1+ 1)+ 1;
.......
f(n) = 2^n -1