C语言解决汉诺塔问题

原文链接:(转载请注明出处)https://dmego.me/2016/10/16/hanoi

一.起源:

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

二.抽象为数学问题:

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

解:(1)n == 1

         第1次  1号盘  A---->C       sum = 1 次

   (2)  n == 2

         第1次  1号盘  A---->B

         第2次  2号盘  A---->C

         第3次  1号盘  B---->C        sum = 3 次

(3)n == 3

第1次 1号盘 A---->C

第2次 2号盘 A---->B

第3次 1号盘 C---->B

第4次 3号盘 A---->C

第5次 1号盘 B---->A

第6次 2号盘 B---->C

第7次 1号盘 A---->C sum = 7 次

不难发现规律:1个圆盘的次数 2的1次方减1

2个圆盘的次数 2的2次方减1

                     3个圆盘的次数 2的3次方减1

                     。  。   。    。   。 

                     n个圆盘的次数 2的n次方减1

故:移动次数为:2^n - 1
下面我们即可进行关于C语言的代码编写:

#include 
using namespace std;
void hanoi(int, char, char, char);
void move(char, char);
int main()
{
    int num;
    cout << "请输入盘子数:";
    cin >> num;
    hanoi(num, 'A', 'B', 'C');
    return 0;
}
void hanoi(int n, char pillar_A, char pillar_B, char pillar_C)
{
    if (n == 1)
        move(pillar_A, pillar_C);
    else
    {
        hanoi(n - 1, pillar_A, pillar_C, pillar_B);
        move(pillar_A, pillar_C);
        hanoi(n - 1, pillar_B, pillar_A, pillar_C);
    }
}
void move(char startpillar, char finalpillar)
{
    cout << startpillar << "->" << finalpillar << endl;
}

其中共有三个圆盘,我们通俗点理解就是:第一次移动是将A柱作为起始柱,将C柱作为辅助柱,将B柱作为目标柱,所以排序为:hanoi(n-1,pillar_A,pillar_C,pillar_B),其中n-1的意思是,我们舍弃最大的那个圆盘,只移动上面的那两个圆盘即可。
第二次移动则是将B柱作为了起始柱,将A柱作为辅助柱,将C柱作为目标柱,就不难理解小高的第二次里面的排序了,这道题使用了简单的递归调用,如果大家有不明白的地方欢迎大家在评论区和我进行多多交流。

你可能感兴趣的:(c语言)