top1编程
← 返回题目
题解

【入门】骨牌铺方格

1 条题解

  • 0
    @ 2026-7-31 16:32:21

    解题思路

    用 1×1、1×2、1×3 的骨牌铺满 1×n 的方格,问有多少种铺法。

    思路:递推。

    看最后一块骨牌怎么放:

    • 最后放 1×1:前面 n-1 格有 f(n-1) 种铺法
    • 最后放 1×2:前面 n-2 格有 f(n-2) 种铺法
    • 最后放 1×3:前面 n-3 格有 f(n-3) 种铺法

    所以 f(n) = f(n-1) + f(n-2) + f(n-3)

    初始:

    • f(1) = 1(只能放 1×1)
    • f(2) = 2(放 1×1+1×1 或 1×2)
    • f(3) = 4(放三个1×1、1×1+1×2 等)

    为什么要用 long long? n 最大 50,铺法数增长很快,会超过 int 范围。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        long long a = 1, b = 2, c = 4, x, n;
        cin >> n;
    
        if (n == 1) {
            cout << 1;
        } else if (n == 2) {
            cout << 2;
        } else if (n == 3) {
            cout << 4;
        } else {
            for (int i = 4; i <= n; i++) {
                x = a + b + c;  // f(n) = f(n-1)+f(n-2)+f(n-3)
                a = b;
                b = c;
                c = x;
            }
            cout << x << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),递推 n 次
    • 空间复杂度:O(1)
    • 1