[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\n",A,C); //如果只有1个盘子直接移动
 5     }else{
 6         hanoi(n-1,A,C,B);  // 部分2率先移动从A移动到B(C是过渡) ,  分解成小问题
 7         printf("%c -> %c\n",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 }

结果示例:

猜你喜欢

转载自www.cnblogs.com/ID-qingxin/p/10013660.html