[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] 汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章