SDUT 1018 骨牌铺方块

本文探讨了在2xn的长方形方格中使用1x2骨牌铺满方格的所有可能方案,并通过递推公式实现了算法。文章提供了一个有效的C++程序实现,能够输出任意给定n值的铺放方案总数。

1.题目

在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

2.正确代码

#include <iostream>

using namespace std;

int main()
{

    long long arr[101];
    int i,n;

    arr[1]=1;
    arr[2]=2;

    while( cin >> n && n )
    {
        for(i=3;i<=n;i++)
            arr[i]=arr[i-1]+arr[i-2];

        cout << arr[n] <<endl;
    }

    return 0;

}

3.思路解读:

我们明确每个代表的可能性,这是关于递推的,x[i]=x[i-1]+x[i-2],但我们又会很好奇,为什么不是x[i]=x[i-1]+x[i-2]+x[i-3]呢?我们需要从头开始理解,x[3]能被x[1]+x[2]来递推到,对于x[3],只关注新加入的一格中方块的方法,只有两种可能,一旦确定下来,之后的可能就是前面的某一种可能,只要确定好这层逻辑关系,那么这道题其实很好解的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值