奔跑的香蕉

逛C++吧的时候看到一个人说看不懂汉诺塔递归算法,我去玩了下发现就是小时候学习机上的一个游戏啊,那时候觉得相当有难度,4个就弄不出来了

之后仔细分析了一下,发现还挺有意思的。

先看看大致的步骤:

1个盘

1 a c

2个盘

1 a b

2 a c

1 b c

3个盘

1 a c

2 a b

1 c b

3 a c

1 b a

2 b c

1 a c

4个盘

1 a b

2 a c

1 b c

3 a b

1 c a

2 c b

1 a b

4 a c

1 b c

2 b a

1 c a

3 b c

1 a b

2 a c

1 b c

说明:编号为

a为左柱子,b为中间柱子,c为右柱子

目标是把所有盘移动到c位置,具体规则我就不细说了~

文字难以理解,,我就多多上图吧

分析:

电脑的计算力和记忆力超群,但是智商低的可以,所以它只能看到事物表面,我们只需要告诉它有两个盘的时候该怎么做

那么现在有4个盘,我们可以:

把1-3看成是一个盘,并且记住这个操作,那么现在只有3,4两个盘,电脑就知道该怎么做了:

但是在进行第一步将3移动到中间柱子的时候,我们还需要进去,就像做梦中梦一样,现在变成了:

目标变成了将3之上的所有盘移动到中间柱子,当然,在把2移动到借用位置的时候,我们还要进去……

以下省略XXX字,我们跳到最后一个

当只有最后一个的时候,我们就直接移动到目标位置咯(注意是目标位置,不是最右的柱子,每一步的目标都会改变,所以我们得根据上一层函数的指示移动),然后跳出

以下再省略XXX字……

在经过不断进入和不断出去之后(所以说电脑的记忆力超群),我们所有的盘就都移动到最终目标了,下面上代码:

#include <iostream>using namespace std;void move(int num,int loc_now,int loc_next,int loc_aim);void move_cout(int num,int loc_now,int loc_next);#define LOC_A1//初始位置#define LOC_B2//借用位置#define LOC_AIM3//目标位置//每个位置的具体作用还要看具体情况,也许LOC_B是目标位置,LOC_AIM是借用位置,这是个宏观的作用int main(){int number;cout<<"please input number"<<endl;cin>>number;move(number,LOC_A,LOC_B,LOC_AIM);return 0;}/******************************************************int num:此盘的编号int loc_now:此盘现在所在的位置int loc_use:将借用此位置移动到目标位置int loc_aim:目标位置*******************************************************/void move(int num,int loc_now,int loc_use,int loc_aim){if(num==1)//如果只剩最后一个,直接移动到目标位置{move_cout(num,loc_now,loc_aim);}else{move(num-1,loc_now,loc_aim,loc_use);//先把除了最下面那个盘移动到借用位置move_cout(num,loc_now,loc_aim);//把最下面的盘移动到目标位置move(num-1,loc_use,loc_now,loc_aim);//再把除了最下面那个盘移动到目标位置}}/******************************************************int num:此盘的编号int loc_now:此盘现在所在的位置int loc_next:将要移动到的位置*******************************************************/void move_cout(int num,int loc_now,int loc_next){cout<<"num-"<<num<<" move from LOC_:"<<loc_now<<" to LOC_:"<<loc_next<<endl;}没想到代码这么短,我们看下运行结果:

move(num-1,LOC_B,LOC_A,LOC_AIM);

版权声明:本文为博主原创文章,未经博主允许不得转载。

青春一经典当即永不再赎

奔跑的香蕉

相关文章:

你感兴趣的文章:

标签云: