[18/11/24] 汉诺塔问题

Posted id-qingxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[18/11/24] 汉诺塔问题相关的知识,希望对你有一定的参考价值。

问题描述:要求将A柱子上的盘子移动到C柱子上,移动过程中大盘子不能在小盘子下边(即必须满足大盘在下,小盘在上),求移动步骤?

技术分享图片

示例:若A上只有1号和2号这2个盘子,移动步骤 A(2)-->>B,   A(1)-->>C ,  B(2)-->>C  【A(2)表示柱子A上的2号盘子】

思想:用递归(以3个盘子为例)

1、若只有1个盘子,直接将他从A柱子上移动到C柱子上;

2、若有n个盘子(假设n=3,即有3个盘子),可以考虑先划分为2个部分,构成大问题。即最下边的1号盘子(部分1)和由2号和3号组成的整体(部分2, n-1个盘子),先将部分2(借助柱子C)移动到柱子B上,再将1号盘子(部分1)移动到柱子C上,最后将部分2(借助柱子A)移动到柱子C上的1号盘子上边,完成要求。

3、部分2的移动过程又是一个小问题,可以用递归。

代码示例:

 1 #include <stdio.h>
 2 void hanoi(int n,char A,char B,char C){  //大问题
 3     if(n==1){
 4         printf("%c -> %c
",A,C); //如果只有1个盘子直接移动
 5     }else{
 6         hanoi(n-1,A,C,B);  // 部分2率先移动从A移动到B(C是过渡) ,  分解成小问题
 7         printf("%c -> %c
",A,C);//部分1 移动
 8         hanoi(n-1,B,A,C);  //部分2 从B移动到C (A是过渡)
 9     }
10 }
11 
12 
13 int main()
14 {
15     int  n ;
16     printf( "输入A柱上盘子的个数:") ;
17     scanf("%d",&n) ;
18     hanoi(n,A,B,C);
19 
20     return 0;
21 }

结果示例:

技术分享图片

 

以上是关于[18/11/24] 汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章

python汉诺塔非递归

汉诺塔问题的详解-附代码

C语言汉诺塔问题

代写Haskell程序 汉诺塔汉诺塔编程代码代写

递归_汉诺塔问题

汉诺塔(代码记录+注释)