一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶,共有多少种跳法?
下面,我们先举一些例子看看:
n=1,只有1种跳法
n=1
n=2,有2种跳法
一次1级or一次2级
n=2
n=3,有3种跳法
一次1级or先2级后1级or先1级后2级
n=3
从上面3个例子可以看出,n个台阶,就有n种跳法。
那么,规律是否就是如此呢?
n=4,有4种跳法
一次1级or先1级后2级后1级or先2级后1级后1级or先2级后2级
n=4
由此,可知,并不是有n级台阶就有n种跳法
eg.4个台阶时
1.先跳一级,以第一级为起点,还有3级台阶,由图可知,3级台阶共3种跳法
2.先跳两级,以第二级为起点,还有2级台阶,由图可知,2级台阶共2种跳法
3.汇总:
4级台阶跳法是2级台阶和3级台阶的跳法的总和
4级台阶共5种
n>3时,满足有n级台阶的跳法=(n-1)级台阶跳法+(n-2)级台阶跳法
类似斐波那契数列问题
而n=1,2,3时,满足有n级台阶就有n种跳法的规律
由此,可推出:
#define _CRT_SECURE_NO_WARNINGS 1
#include
//青蛙跳台阶问题
int Jump(int n)
{
if (n <=3)
{
return n;
}
else
{
return Jump(n - 1) + Jump(n - 2);
}
}
int main()
{
int n = 1;//台阶数
scanf("%d ", &n);
int ret = Jump(n);
printf("%d种跳法", ret);
return 0;
}
输出界面
将A柱上的n个盘子,借助B柱,最终全部挪到C柱上。挪到的过程中ABC柱上的盘子,必须保持大盘子在小盘子底下。
下面,我们先举一些例子看看:
n=1,只用挪动1次:A---->C
n=1
n=2,挪动3次:A---->B A---->C B---->C
n=2
n=3,挪动7次:A---->C A----->B C---->B A---->C B---->A B---->C A---->C
n=3
移动次数规律:
n=1,共移动1次
n>1,共移动(2^n -1)次
eg.n=2,移动3次,3=2^2-1
n=3,移动7次,7=2^3-1
移动位置规律:
每次先移动(n-1)个盘子,将(n-1)个盘子通过B柱实现中转,接着将剩余的最后1个盘子移动到C柱上,最后将(n-1)个盘子通过A柱实现中转,移动到C柱上
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
//汉诺塔问题
//n:盘子个数
//pos1:起始位置
//pos2:中转位置
//pos3:目标位置
int count = 0;
void move(char pos1, char pos2)//模拟盘子移动过程
{
printf("%c --> %c \n", pos1, pos2);
count++;//计数
}
//有n个盘子,先将(n-1)个盘子从A通过C挪到B
//只剩1个盘子,直接从A挪到C
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)
{
move(pos1, pos3);//只剩1个盘子,直接从A挪到C
}
else
{
Hanoi(n - 1, pos1, pos3, pos2);//有n个盘子,先将(n-1)个盘子从A通过C挪到B
move(pos1, pos3);//只剩1个盘子,直接从A挪到C
Hanoi(n - 1, pos2, pos1, pos3);//将剩余的(n-1)个盘子从B通过A挪到C
}
}
int main()
{
int n = 0;
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
printf("%d个盘子需要移动%d次\n", n, count);
return 0;
}
输出界面
PS:小江目前是个新手小白,目前,自己就总结了这些自己觉得有意义的题目。欢迎大家在评论区讨论哦!有问题也可以讨论的!
如果对你有帮助的话,记得点赞+收藏⭐️