全面启动门户网站建设,电子商务网站开发问题研究,福州网络营销网站,长春商城网站制作1.什么是汉诺塔问题
简单来说#xff0c;就是有三个柱子#xff0c;分别为A柱#xff0c;B柱#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘#xff0c;我们需要借助B柱和C柱#xff0c;将A柱上的所有圆盘转移到C柱上#xff0c;并且一次只能移动一个圆盘#…1.什么是汉诺塔问题
简单来说就是有三个柱子分别为A柱B柱C柱。其中A柱从上往下存放着从小到大的圆盘我们需要借助B柱和C柱将A柱上的所有圆盘转移到C柱上并且一次只能移动一个圆盘且在移动的过程中大圆盘不能再小圆盘的上面。
2.思路分析
首先我们的最终目的是将A柱上的圆盘全部转移到C柱上。则当A柱上只有一个圆盘我们直接将A柱上的圆盘转移到C柱上就行了。
如下图所示 当A柱上有多个圆盘时就很复杂了我们需要慢慢来分析。
当A柱上有2个圆盘时。我们要先将第一个圆盘转移到B柱上然后再将第二个圆盘转移到C柱上然后再将B柱上的圆盘转移到C柱上。
简化为 A-B A-C B-C。
如下图所示 当有3个圆盘时。
我们先将A盘上的第一个盘子转移到C柱再将A柱上的第二个圆盘转移到B柱上接着再将C盘上的圆盘转移到B柱上再将A柱上的最后一个圆盘转移到C柱上接着再将B柱上的第一个圆盘转移到A柱上再将B柱上的最后一个圆盘转移到C柱上接着再将A柱上的圆盘转移到C柱上就完成了。
简化来说A-C A-B C-B A-C B-A B-C A-C。
如下图所示 通过2个圆盘和3个圆盘的例子发现要向将A柱上的圆盘按要求转移到C柱上我们要将n-1个圆盘全部转移到B柱上。
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int count 0;//全局变量做计数器
void move(char Tower_1, char Tower_2)
{printf(将 %c 移动到 %c \n, Tower_1, Tower_2);count;
}
void Hanoi(int n, char Tower_1, char Tower_2, char Tower_3)
{if (n 1)//是一个的话就直接从Tower_1移动到Tower_3move(Tower_1, Tower_3);else{//不是一个的话先借助Tower_3将Tower_1上面的n-1个移动到Tower_2Hanoi(n - 1, Tower_1, Tower_3, Tower_2);//完成此过程后Tower_1上面还有最后一个 move(Tower_1, Tower_3); //将Tower_1上面的最后一个移动到Tower_3//将Tower_2上面的n-1个通过Tower_1移动到Tower_3Hanoi(n - 1, Tower_2, Tower_1, Tower_3);}
}
int main()
{printf(请输入圆盘个数:\n);int n 0;scanf(%d, n);Hanoi(n, A, B, C);printf(一共进行了%d次, count);return 0;
}
汉诺塔问题涉及到了递归的的问题其里面有两个递归的过程其实十分复杂的。