两个问题均要先画图找规律。分析后再写代码
1. 汉诺塔问题
题目:
有三个柱子:A, B, C
起始:有n个盘子(由小到大,从上往下放置)都在A柱子上
目的:把A柱子上的所有盘子移到C柱子上,并求出最少的移动步骤
限制条件:一次只能移动一个盘子,大的盘子只能放在小的盘子下面
分析:
如果只有一个盘子,直接把盘子从A移到B
如果不止一个盘子,则通过B和C把n-1个盘子移到B,把最大的盘子移到C
以此类推
通过手动推导可以发现符合数学规律,步骤为2^n - 1
当n为10时,程序就要跑很久了
代码:
#include<stdio.h>
void move(char pose1, char pose2)
{
printf("%c->%c ", pose1, pose2);
}
void Hanoi(int n, char pose1, char pose2, char pose3)//依次起始,中转,目标
{
if (n == 1)
{
move(pose1, pose3);
}
else
{
Hanoi(n - 1, pose1, pose3, pose2);//依次起始,中转,目标
move(pose1, pose3);
Hanoi(n - 1, pose2, pose1, pose3);//依次起始,中转,目标
}
}
int main()
{
int n;
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
printf("\n");
return 0;
}
2.青蛙跳台阶问题(斐波那契数列)
题目:
有一只青蛙,它有两种跳的方式:一次一台阶,一次两台阶
有n级台阶
问:青蛙一共有多少种跳法
分析:
先画图分析,找规律
n = 1, 1
n = 2, 2
n = 3, 3 (1 + 2)
n = 4, 5 (2 + 3)
n = 5, 8 (3 + 5)
当n大于2时,青蛙起跳,有两种情况:
1.跳一阶
跳上去后把这个看成起点,问题就变成青蛙要跳n - 1 阶(往前推算已经求过)
2.跳两阶
跳上去后把这个看成起点,问题就变成青蛙要跳n - 2 阶(往前推算已经求过)
结果:
把这两种情况数加起来
代码:
#include<stdio.h>
int jump(int n)
{
if (n <= 2)
{
return n;
}
else
{
return jump(n - 1) + jump(n - 2);
}
}
int main()
{
int n;
scanf("%d", &n);
printf("青蛙跳%d个台阶有%d种跳法\n", n, jump(n));
return 0;
}