Problem K:骨牌铺方格(HDU 2046)

Problem Description

    在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.

    例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

    

Input

    输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。

Output

    对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

Sample Input

1 3 2

Sample Output

1 3 2

————————————————————————————————————————————

思路:

设:用a[i]表示2*i的方格的方法数

已知:

    a[1]=1;

    a[2]=2;

    a[3]=3;

则:

    a[i]实质是在2*(i-1)的格子后加上一格2*1的方格,骨牌在这一格上横放或竖放。

    如果前面i-1块已经铺好,则第i块只有竖着放;

    如果前面i-1块已经铺好,则第i块只有横着放。

                                                                                         (图源网络 侵删致歉)

简单验证:
      规格为1时: 1种
      规格为2时: 2种
      规格为3时: 3种
      规格为4时: 5种
      规格为5时: 8种
               ……
可推:第 n 个的可能路径为  f(n)=f(n-1)+f(n-2)(斐波那契数列)

Source Program

#include<iostream>
using namespace std;
int main()
{
    long long a[50];//注意用long long
    int n;
    int i;

    /*预处理,先求出斐波那契数列*/
    a[0]=1;
    a[1]=1;
    a[2]=2;
    for(i=3;i<=50;i++)
        a[i]=a[i-1]+a[i-2];

    while(cin>>n)
        cout<<a[n]<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/79747960