2016级算法第一次上机——C AlvinZH去图书馆

来源:互联网 发布:程序员改行能做什么 编辑:程序博客网 时间:2024/06/05 09:45

C AlvinZH去图书馆

时间限制:500ms   内存限制:32768kb

题目描述

AlvinZH最近在看《冰与火之歌》系列,这天,他又看完了一本书,于是决定去图书馆再借一本。大家知道,在去图书馆的路上,有一条“扯蛋路”。大概是这个样子的(秀一波拍照技术):

AlvinZH从第一块石砖出发,接下来他可以走到第二块石砖或第三块石砖,有时候走的很不爽,甚至可以直接跨过两个石砖,到达第四块石砖,但是不能连续两次这种操作,因为这样。。。对身体不好。现在假设有一条含n块石砖的小路,请你计算出AlvinZH从第一块石砖出发有多少种安全的走法。

输入

输入将由多组测试数据组成,以EOF结尾。

每组数据只有一行,为小路的总石砖数n(0<n≤50)。

输出

对于每组数据,输出一行,为走过小路的方法数。

输入样例

123

输出样例

124

样例解释

1:一步走完;
2:先走到2再走完,或者直接走完;
3:111或12或21或3。

题目分析

解法一我们可以这样想,到达n这个点可以是来自n-1n-2n-3这三个位置的,我们用a[i]表示到达位置i的方法数,则按理来说a[n]=a[n-1]+a[n-2]+a[n-3]的,但是本题有一个要求,不能连续两次跨三步,所以并不能直接加a[n-3],必须保证n-3这个点的前一步不是3块砖,所以应该加的是a[n-4]+a[n-5].

  所以到达位置n的方法数a[n]=a[i-4]+a[i-5]+a[i-2]+a[i-1];

参考代码一:

#include<cstdio>int main(){    int n;    long long a[51];    a[1]=1;a[2]=2;a[3]=4;a[4]=7;a[5]=13;    while(scanf("%d",&n)!=EOF)    {        for(int i=6;i<=n;i++)            a[i]=a[i-4]+a[i-5]+a[i-2]+a[i-1];        printf("%lld\n",a[n]);    }}

 

解法二:我们可以用一个二维数组来解题,其中a[0][i]表示用两步或一步到达i点,a[1][i]表示三步到达i点,这样更容易理解。

这样的话,a[0][i]=a[0][i-1]+a[1][i-1]+a[0][i-2]+a[1][i-2];     a[1][i]=a[0][i-3].

总方法数的话,两个加起来就行了。

参考代码二:

#include<cstdio>int main(){    int n;    long long a[2][57];    a[0][1]=1;a[1][1]=0;    a[0][2]=2;a[1][2]=0;    a[0][3]=3;a[1][3]=1;    while(scanf("%d",&n)!=EOF)    {        for(int i=4;i<=n;i++)        {            a[0][i]=a[0][i-1]+a[1][i-1]+a[0][i-2]+a[1][i-2];            a[1][i]=a[0][i-3];        }        printf("%lld\n",a[0][n]+a[1][n]);    }}

 


 

 

 

 

 

 

 

 

原创粉丝点击