首页 > 其他分享 >【题解】1059: 贴瓷砖

【题解】1059: 贴瓷砖

时间:2022-12-27 16:34:29浏览次数:52  
标签:return int 题解 墙面 瓷砖 1059 tiling wall

1059: 贴瓷砖

题目描述

有一块大小是 2 * n 的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是 2 * 1 和 2 * 2,请计算一共有多少种铺设的方法。

输入

输入的第一行包含一个正整数T(T<=20),表示一共有T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示墙面的大小是2行N列。

输出

输出一共有多少种铺设的方法,每组数据的输出占一行。

解析

最容易想到的解法就是DFS,模拟一遍整个铺瓷砖的过程,但是不出所料,时间超限~

既然不能用暴力解法,那就要去思考结果是不是可以通过一个递推式算出来的。要想写出递推式,就要去分解大问题,直到它的规模足够小,能直接得出结果。最小规模显然是n=1的情况,对于一个2*1的墙面,贴法只有1种。这时我们再去思考n=2的情况,由于n=2时就可以使用2*2的瓷砖,且可以将2*1的瓷砖横过来贴了,所以n=2的情况有点特殊,结果是3种。那么再想想n=3的情况,如果我们要拆解2*3的墙面,有两种方法:1.先用一块2*1的砖竖着贴在墙面最右边,这样剩下的就是2*2的墙面了,而n=2时的结果是3,这是我们已经知道的;2.用一块2*2的瓷砖贴在最右边,这样剩下的就是2*1的墙面,结果为1,但是注意,这种贴法还有另一种情况,那就是我们可以用两块2*1的瓷砖叠成一个2*2的瓷砖,所以这里其实有两种情况,所以结果应该为1*2=2。所以,对于2*3的墙面,结果就为3+1*2=5。

从n=3的例子我们可以看出来,当n>=3时,就可以尝试去分解问题了,对于一个2*n(n>=3)的墙面,其瓷砖贴法数为2*(n-1)的墙面贴法数和2*(n-2)的墙面贴法数的两倍的和。如果令f(n)表示为一面2*n的墙面的解,那么就有递推式:f(n)=f(n-1)+2*f(n-1),特殊的,f(0)=0,f(1)=1,f(2)=3。

代码

AC代码:

#include <bits/stdc++.h>
using namespace std;

int tiling(int i)
{
    if (i == 0) return 0;
    if (i == 1) return 1;
    if (i == 2) return 3;
    return tiling(i - 1) + tiling(i - 2) * 2;
}

int main()
{
    int n; cin >> n;
    while (n--) {
        int i; cin >> i;
        cout << tiling(i) << endl;
    }
    return 0;
}

顺便再贴一个自己的dfs解法的代码:

#include <bits/stdc++.h>
using namespace std;

int m, ans = 0;
int** wall = new int*[3];

void tiling(int t, int n)
{
    if (t > m) {
        ans++;
        return;
    }
    if (wall[1][t] == 0) {
        if (wall[2][t] == 0) {
            wall[1][t] = wall[2][t] = n;
            tiling(t + 1, n + 1);
            wall[1][t] = wall[2][t] = 0;
            if (t + 1 <= m) {
                wall[1][t] = wall[2][t] = n;
                wall[1][t + 1] = wall[2][t + 1] = n;
                tiling(t + 2, n + 1);
                wall[1][t] = wall[2][t] = 0;
                wall[1][t + 1] = wall[2][t + 1] = 0;
            }
        }
        if (wall[1][t + 1] == 0) {
            wall[1][t] = wall[1][t + 1] = n;
            tiling(t, n + 1);
            wall[1][t] = wall[1][t + 1] = 0;
        }
    }
    else if (wall[2][t] == 0) {
        if (t + 1 <= m) {
            wall[2][t] = wall[2][t + 1] = n;
            tiling(t + 2, n + 1);
            wall[2][t] = wall[2][t + 1] = 0;
        }
    }
}

int main()
{
    int n; cin >> n;
    while (n--) {
        cin >> m;
        if (m <= 0) {
            cout << 0 << endl;
            continue;
        }
        for (int i = 1; i < 3; i++) {
            wall[i] = new int[m + 1];
            for (int j = 1; j < m + 1; j++)
                wall[i][j] = 0;
        }
        tiling(1, 1);
        cout << ans << endl;
        ans = 0;
    }
    return 0;
}

 

标签:return,int,题解,墙面,瓷砖,1059,tiling,wall
From: https://www.cnblogs.com/codas/p/17008338.html

相关文章

  • P6357 题解
    Luogu题面题目描述给定一串长度为\(n\)的数字,数字为\(0\sim9\)之间的任意一个,下标从\(1\)记起。然后进行\(m\)次区间查询,每次查找区间\([l,r]\)的区间和,......
  • answerOpenCV轮廓类问题解析
    contour在opencv中是一个基础的数据结构,灵活运用的话,作用很大。以contour为关键字,在answerOpenCV中能够发现很多有趣的东西。 1、无法解决的问题​​......
  • 【题解】ABC283
    \(\text{AtCoderBeginnerContest283}\)APower无意义题,直接输出。BFirstQueryProblem无意义题,维护一个支持单点修改、单点查询的数据结构。(雾)CCashRegister......
  • Atcoder Beginner Contest ABC 283 Ex Popcount Sum 题解 (类欧几里得算法)
    题目链接令\(p=\lfloor\frac{n-r}m\rfloor\),则我们其实是要对所有\(0\lei\le29\)求\(\sum_{j=0}^p(\lfloor\frac{mj+r}{2^i}\rfloormod\2)\)。右边那个东西如果没......
  • 2022 International Collegiate Programming Contest, Jinan Site 部分题目简要题解
    从这里开始比赛目录傻逼学院负责人ProblemBTorch注意到$a_1,b_1,a_2,b_2$的和不会超过$10^6$考虑胖先生的周期开始的时候,瘦先生的周期在时......
  • USACO22DEC青铜组题解
    T1:CowCollege总学费\(=\)设置的单人学费\(\times\)接受的奶牛数一旦固定单人学费,就能确定接受的奶牛数单人学费可以是哪些值?\(\{c_1,c_2,\cdots,c_n\}\)其中......
  • P3537 [POI2012]SZA-Cloakroom 题解
    题目大意有\(n\)件物品,每件物品有三个属性\(a_i,b_i,c_i(a_i<b_i)\)。再给出\(q\)个询问,每个询问由非负整数\(m,k,s\)组成,问是否能够选出某些物品使得:对......
  • P4928 [MtOI2018]衣服?身外之物! 题解
    题意gcd共有\(n\)件衣服,编号为\(A_1,A_2,\cdotsA_n\)。每一件衣服分别拥有颜色值和清洗时间,他在每一件衣服穿完以后都会将其送去清洗,而这件衣服当天所拥有的舒适感......
  • NSIS编辑时的乱码问题解决方法
    在Windows中文系统中,HMNISEdit下使用非中文和英文,比如韩文、日语或者阿拉伯语等。会发现编辑的文字变成乱码或者问号。     1、在安装的过程中显示乱码。2、......
  • AcWing291.蒙德里安的梦想题解
    题解:蒙德里安的梦想注:本题解内容简陋,多有不周,敬请谅解。如果有问题请在评论区留言。谢谢。由于作者能力有限,这篇题解不会给出太严谨的证明,只是旨在帮助大家更好地理解此......