本文代码参考这篇博客,感觉非常有用,并附一个汉诺塔小游戏的链接,可以验证通过玩游戏体会其中的道理;
汉诺算法分析:有a、b、c三个柱子,需要将a上面的那个n个盘子(从下到上盘子依次变大),移动到C柱上,移动的过程借助B柱,但不能出现大盘在小盘的情况。情况如图所示:
步骤一: 如果只有一个盘子 直接将a柱子上的盘子移到C柱上
否则 先将a柱上的n-1盘子移到B柱上,再将第n个盘子移动到C柱上。
要想完成将a柱上的n-1个盘子移到B柱上,遇到了刚才同样的问题,即将n-1个盘子从a柱借由c柱将n-2个盘子的先移到C柱上,再将最下面的第n-1个盘子移到B柱上。
具体代码如下:
#include<iostream>
using namespace std;
void hanoi(int n, char a, char b, char c)
{
if (1 == n)/* 如果剩下一个盘子,直接从a-->c */
{
cout << n << ":"<<a<<"-->" << c << endl;
}
else
{
/* 把n-1个盘子从a移动到b借助于c */
hanoi(n - 1, a, c, b);
cout << n << ":" << a << "-->" << c << endl;/* 把第n和盘子从a移动c */
hanoi(n - 1, b, a, c);/* 把n-1个盘子从b移动到c借助于a */
}
}
int main()
{
int num = 0;
cin >> num;
hanoi(num, 'a', 'b', 'c');
return 0;
}
输出结果示例: