代码新人渣第一次记录博客,是关于第一次思考的实验汉诺塔的原理。
实验的要求是有n个从小到大的圆盘已经在a柱了,一共有三个柱子,分别是最左边的a柱,中间的b柱,最右边的c柱。每次移动只能移动一个圆盘并且要保持每个柱子的圆盘都是从小到大的顺序(从上往下)。
分析:
根本目的是将a中一共n个圆盘移动到c。于是大致分为了三个步骤。
第一步:将在a中最大的上面的n-1个圆盘移动到b。
第二步:将在a中最大的圆盘(第n个)直接移动到c。
第三步:将在b中共n-1个圆盘移动到c中。
观察发现,除了第二步是可以一步实现的,第一步和第三步都是需要很多步骤的,然后继续分析。
在第一步中得到第一个问题:将在a中n-1个圆盘移动到b,如何移动?
分析:
此时根源是a,目标是b,过渡是c。
第一步是除了第n-1个(也就是这里面最大的)不动,其余n-2个从a到c。
第二步第n-1个(也就是这里面最大的)直接从a到b。
第三步在c中的n-2个再到b中。
这样第一个问题的大致思路就出来了,发现和总的分析有点类似。
在第二部中得到第二个问题,b中n-1个圆盘移动到c,如何移动?
分析:
此时根源是b,目标是c,过渡是a。
第一步是在b中的n-1个圆盘里面,除了最大的,其余的n-2个圆盘从b到a。
第二步就是最大的第n-1个直接从b到c。
第三步在a中的n-2 个再到c中。
这样第二个问题的分析出来了,发现和前面的分析差不多。
然后就得到了递归规律。本质就是有三个柱子,分别是根源,过渡,目标,每次要保证最大的在目标,其余的就得在过渡的柱子呆这,而这其余的柱子是怎么移动的,是怎么保持从小到大的顺序排列好的,这就是套娃的问题。
代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
void howtomove(int n,char a, char b,char c){
if(n==1)//如果只有一个盘子,直接移动
cout << a << "->" << c << endl;
else{
howtomove(n - 1, a, c, b); //对照问题二,是把n-1个盘子从根源a借助过度c移动到b
cout << a << "->" << c << endl;
howtomove(n - 1, b, a, c);//对照问题三,同理可得是把n-2个盘子从根源b借助过度a移动到c
//归纳整理得递归规律。
}
}
int main(){
int n;
cin >> n;
howtomove(n, 'a', 'b', 'c');//利用函数,其中第一个参数是盘子数,第二个参数是根源,第三个参数是过度,第四个参数是目标
}
文章参考了很多人的,如有雷同涉及原创问题请联系。