题目描述
Zexal打算借助河中间的石砖过到河对岸去。Zexal从第一块石砖出发,接下来他可以走到第二块石砖或第三块石砖,有时候走的很不爽,甚至可以直接跨过两个石砖,到达第四块石砖,但是不能连续两次这种操作,因为这样消耗体能比较大。现在假设河中含n块石砖,且这些石砖呈直线分布,请你计算出Zexal从第一块石砖出发有多少种安全的过河方法。
输入
输入将由多组测试数据组成,以EOF结尾。
每组数据只有一行,为河中的总石砖数n(0<n≤50)。
输出
对于每组数据,输出一行,为过河的方法数。
输入样例
1
2
3
输出样例
1
2
4
样例解释
1:一步走完;
2:先走到2再走完,或者直接走完;
3:111或12或21或3。
思路分析
思路1:
设置一个60×2的数组。第i行代表到达第i个石块所用方法数。
其中每一行的第一列代表上一次使用1跳或2跳达到此处的方法数。第二列代表上一次使用3跳到达此处的方法数。
先设置好前三行的元素数,从第四行开始:
对于第i行,上一次使用1跳到达此处的方法数为i-1的所有方法数,即a[i-1][0]+a[i-1][1]。上一次使用2跳到达此处的方法数为a[i-2][0]+a[i-2][1]。
即a[i][0] = a[i-1][0]+a[i-1][1]+a[i-2][0]+a[i-2][1]
若上次使用3跳到达此处,则上上次不可使用3跳
即a[i][1] = a[i-3][0]
(不加a[i-3][1])
思路2:
使用一个一维数组存储到达每一个石头的总方法数
先设置好前五个数
从第六个数开始,对于第i个数:
如果使用1跳到达此处,方法数为a[i-1]
如果使用2跳到达此处,方法数为a[i-2]
如果使用3跳到达此处,则不是使用3跳到达i-3的,即使用3跳到达i的方法数等于使用1跳或2跳到达i-3的方法数,即a[i-4]+a[i-5]
AC代码
思路1:
#include<stdio.h>
long long a[60][2],n;
int main()
{
int i;
a[1][0]=1;
a[1][1]=0;
a[2][0]=2;
a[2][1]=0;
a[3][0]=3;
a[3][1]=1;
for(i=4;i<=50;i++)
{
a[i][0]=a[i-1][0]+a[i-1][1]+a[i-2][0]+a[i-2][1];
a[i][1]=a[i-3][0];
}
while((scanf("%d",&n))!=EOF)
{
printf("%lld\n",a[n][0]+a[n][1]);
}
return 0;
}
思路2:
#include<stdio.h>
long long a[60],n;
int main()
{
int i;
a[1]=1;
a[2]=2;
a[3]=4;
a[4]=7;
a[5]=13;
for(i=6;i<=50;i++)
{
a[i]=a[i-1]+a[i-2]+a[i-4]+a[i-5];
}
while((scanf("%d",&n))!=EOF)
{
printf("%lld\n",a[n]);
}
return 0;
}