Hanoi汉诺塔问题

问题描述

 输入格式

 输出格式

 样例输入

3

样例输出

A--->C

A--->B

C--->B

A--->C

B--->A

B--->C

A--->C

题解

当n=1时,移动步骤为

    A--->C

当n=2时,移动步骤为

    A--->B

    A--->C

    B--->C

当n=3时,移动步骤为

    A--->C

    A--->B

    C--->B

    A--->C

    B--->A

    B--->C

    A--->C

我们先把A座上的圆盘从上到下编号

观察以上三种情况,当我们想把A座上从上往下第i个圆盘移到C座上时,我们可以先把前i-1个圆盘移到B座上,然后把第i个圆盘移到C座上,再把B座上所有圆盘移到C座上

而前i-1个圆盘从A座移到B座的过程,和前i个圆盘从A座移到C座的过程类似,都是把一堆圆盘从一根柱子移到另一根柱子,且保证所有圆盘的相对位置在移动前后保持不变

我们把前i-1个圆盘从A座移到B座,可以先把前i-2个圆盘移到C座,然后把第i-1个圆盘移到B座,再把前i-2个圆盘移到B座

把前i-2个圆盘移到C座,可以先把前i-3个圆盘移到B座,然后把第i-2个圆盘移到C座,再把前i-3个圆盘移到C座

……

于是我们考虑递归

我们定义一个函数hanoi(int n,char a,char b,char c),表示把前n个圆盘按上述步骤从a座移到c座(a,b,c用于存储三根柱子的编号,其中a的值可能为’A’,’B’,’C’;b,c也是)

如果当前A座上只剩1个圆盘,直接移到C座上并打印路径

否则,先把前n-1个圆盘移到b座,即hanoi(n-1,a,c,b),然后把第n个圆盘从a座移到c座(打印路径),再把前n-1个圆盘从b座移到c座,即hanoi(n-1,b,a,c)

 1 #include <stdio.h>
 2 
 3 void hanoi(int n,char a,char b,char c)
 4 {
 5     if (n==1) printf("%c--->%c
",a,c);
 6     else
 7     {
 8         hanoi(n-1,a,c,b);
 9         printf("%c--->%c
",a,c);
10         hanoi(n-1,b,a,c);
11     }
12     return;
13 }
14 
15 int  main()
16 {
17     int n;
18     scanf("%d", &n);
19     hanoi(n, 'A', 'B', 'C');
20     return 0;
21 }
原文地址:https://www.cnblogs.com/rabbit1103/p/13931533.html