一.汉诺塔问题
先从比较麻烦的开始吧青蛙跳台阶问题比较简单。
先说一下规则吧有三根邻近的柱子,标号为A,B,C。 2.A柱子上从下向上按金字塔状叠起来着n个不同大小的圆盘。 3.现在把所有的盘子一个一个挪动到柱子B上,而且每一次挪动同一根柱子上都不可以出现大盘子在小盘子上方。
也就是这样的一个小游戏,首先肯定是吧最小的放到3号柱子上也是就这样之后就是将第二块放到2号柱上
接下来就是将最小的给1号柱上的盘子腾出地方
接下来就只需要将1号柱上的盘子放到3号柱上,然后再以1号柱为跳板将第二个盘子放到3号柱上,然后在将第一个盘子放到3号柱上
也就是这样,如果认真观察可以发现
我们在移动盘子的时候会把n-1个盘子挪到2号柱上之后才可以将第n个盘子放到3号柱上
这时我们又需要将第n-1个盘子挪到3号柱上,我们这时举的例子有一点少我们假想一下2号柱上的第n-1个盘子上面不是一个盘子而是n-2个盘子那我们要将第n-1个盘子放到3号柱的话是不是就需要将上面的n-2个盘子放到一号柱上。
这时是不是就相当上面将n-1个盘子放到2号柱上,只不过这时的2号柱变成了一号住,但都是经过一个柱子中转之后再犟嘴后一个盘子放到3号柱上。
如果我们不只放了3个盘子的话是不是会有这种情况,然后再将2号柱上的盘子放到3号柱上是不是又到了刚开始的时候,只不过盘子少了。那正如我们上一篇文章讲的是不是就符合递归的从复杂到简单的问题。那下面我们将这个过程转换为代码
首先将我们的主函数写一下,我们规定1号柱为‘A’二号柱为‘B’三号柱为‘C’
int main()
{
int n = 0;
char pos1 = 'A';
char pos2 = 'B';
char pos3 = 'C';
scanf("%d", &n);
Hanno(n, pos1, pos2, pos3);
return 0;
}
参数的含义
1.n为盘子数
2.pos1为启始的位置
3.pos2为中转的位置
4.pos3为到达的位置
函数的内容
void Hanno(int n, char pos1,char pos2,char pos3)
{
if (n == 1)
{
move(pos1, pos3);//当n=1时将启始的盘子放到需要到达的位置上
}
else
{
Hanno(n - 1, pos1, pos3, pos2);//进入函数将A上的n-1个盘子转到B上
move(pos1, pos3);//将A柱上剩下的盘子放到C柱上
Hanno(n - 1, pos2, pos1, pos3);//这时B柱上有n-1个盘子这时将A当为中转
//此时又回到了刚开始的情况A为启始B为中转C为终点
}
}
void move(char pos1,char pos3)
{
printf("%c->%c ", pos1, pos3);
}
注意:函数的过程与游戏的玩法没有关系,理解代码不一定会玩qwq
代码只是这个游戏的其中一个状态,但是大概的思路就是
这两个临界状态不断的去进行这两个形式,每次会有一个盘子放到C柱上最终所有的盘子会减完的。
所以说还是那句话 会写代码不一定会玩游戏。
二.青蛙跳台子问题
这个就很简单了这个跟那个斐波纳契数差不多
先说一下问题吧:有一个青蛙跳n个台阶他一下可以条1个也可以一下跳2个,问有多少中跳法。
首先当有一个台阶时他无论怎么跳那肯定只有1种方法吧
然后当有两个台阶时它可以选择一下跳上去,也可以选择一个一个跳,这样的话就有两种方法。
当为三个台阶的时候它可以选择第一步只跳一个也可以选择跳两个,无论是选择哪种方法都可以。如果选择跳一个那么前面还有两个台阶那么现在他又要面临一个选择是跳2个还是选择跳1个,跳2个的话达成目标,跳1个的话还剩下一个还得再跳1个。
那么如果第一次选择跳2个的话就只还剩下1个那它只能选择跳1个了没有别的跳法。
所以有3个台阶的话有2+1=3种方法。
这时我们就可以发现只要让n逐渐减小变为1或者2时就可以得到有多少种方法,下面给大家用代码展示一下
#include<stdio.h>
int Jump(int n)
{
if (n==2)
{
return 2;
}
else if (n == 1)
{
return 1;
}
else
{
return Jump(n - 1) + Jump(n - 2);
}
}
int main()
{
int n = 0;
int sum = 0;
scanf("%d", &n);
sum = Jump(n);
printf("%d\n", sum);
return 0;
}
注意:由于青蛙可以跳1个也可以跳2个,所以不知道最后会剩下几个,可能是1个也可能是2个,既然这样只需要将两种情况都写下来就可以了。