汉诺塔问题解答
来源:互联网 发布:初级linux运维面试题 编辑:程序博客网 时间:2024/05/13 06:24
汉诺塔的盘子移动过程中目的将盘子从A(初始盘)借助B(借用盘)移动到C(目标盘)。整个过程注意把握两点:
一:一次递归调用中三个盘子分别起到了什么作用。
二:调用以后三个盘子的角色又变换成了什么。
详细分析:
(n=2)两个盘子的情况下:
1.第一次调用find函数A盘代表初始盘,B盘代表目标盘,C盘代表借用盘。
2.按照Find函数Find(n, A, B, C)的排列顺序即,A的位置为初始盘,B的位置为借用盘C的位置为目标盘,故第一次调用Find函数的时候传值顺序为find(n-1,A,C, B,);
3.此刻第一次调用已经结束,ABC三个盘的盘片数为A只有n号盘,B有n-1号个盘子,C为0个。
4.此刻调用mov()函数,将A上的n号盘移动到C。
5.此刻第二次调用find函数,但是其中ABC角色已经发生了变化但是Find函数的位置(初始盘,借用盘,目标盘)没有变。故此刻为借用C盘将B盘上的N-1个盘移动到A盘上。再次调用Find函数时传值为find(n-1,B,A, C)。
注意:
1.盘片的功能确定,剩余盘片数所在的盘为初始盘,C盘永远为目标盘,空盘为借用盘。
2.把握一点,函数Find(n剩余盘片数,A初始盘,B借用盘,C目标盘)即可。
#include <stdio.h>int i=1;bool mov (int n,char A,char C){ printf("第%d次,将%d号盘%c------>%c\n",i,n,A,C); i++; return true ;}bool find(int n,char A,char B,char C) { if (n==1) mov (1,A,C); else { //盘多的为初始盘, // 1.借c把上A上的盘移动到b上,此时A为初始盘,B为目标盘,C为借用盘 // 2.把第N个盘从A移动到C上,此时只有一个、n号盘 // 3.把B借用A移动到c ,此时A为借用盘B为初始盘,C为目标盘 find (n-1,A,C,B); mov(n,A,C); find (n-1,B,A,C); } return true;} int main() { int n; char A='A',B='B',C='C'; printf ("请输入汉诺塔的盘子数!"); scanf ("%d",&n); find(n,A,B,C); return 0; }
阅读全文
0 0
- 汉诺塔问题解答
- 问题解答
- 问题解答
- 问题解答
- gridview问题解答
- 洗牌问题解答
- CF问题解答
- Shark 问题解答
- gridview问题解答
- 婚姻问题解答
- rpm问题解答
- wifi 问题解答
- C++问题解答
- java问题解答
- 一些问题解答
- 问题解答一
- 点滴问题解答
- jquery-问题解答
- 网络的基本知识
- 单层神经网络、多层感知机、深度学习的总结
- 使用Eclipse构建Maven的SpringMVC项目
- STM32F103 Slave I2C配置
- HDU 3065-病毒侵袭持续中
- 汉诺塔问题解答
- Fedora 27/26/25 NVIDIA 驱动安装
- 自学Python之Python基础:(四)Python多线程
- 安装Ubuntu后必须要做的几件事(一)
- 梯度弥散和梯度爆炸
- 资料整理
- Android设计模式之单例模式
- 一次失败的挂马
- re:Invent 2017的四个侧面,感受中美云计算生态