骨牌覆盖

题目描述

用一个1*3的骨牌去覆盖一个3*n的长方形,求所有可能的方案数,n的范围(n的范围 1<=n<=20000)方案数请输出对1000000007取模的结果

输入

n
40%  数据 n<=20
80% 数据 n<=100
100%的数据 n<=20000

输出

所有可能方案数 对1000000007取模的结果

样例输入复制

3

样例输出复制

2

自上向下递归:

找规律可知f(n)=f(n-1)+f(n-3)

#include<bits/stdc++.h>
using namespace std;
int F[20000]={0,1,1,2};

int f(int n){
    if(n==1&&n==2)return 1;
    if(n==3)return 2;
    if(F[n]!=0)
    return F[n]%1000000007;
     F[n]=(f(n-3)+f(n-1))%1000000007;
    return F[n];
}

int main(){
    int n;
    cin>>n;
    cout<<f(n);
    

自下向上循环:

#include<bits/stdc++.h>
using namespace std;
int F[20000]={0,1,1,2};

int main(){
    int n;
    cin>>n;
    for(int i=4;i<=n;i++)
    F[i]=F[i-1]+F[i-3];
    cout<<F[n];
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们可以将特殊棋盘分成4个相等的部分,分别考虑每个部分的覆盖情况。由于每个L型骨牌覆盖3个方格,而特殊方格无法被覆盖,因此每个部分中必定有一个空位,使得无法被覆盖。我们可以将这个空位标记为特殊点,并且要求特殊点必须在L型骨牌的中心位置上。 接下来考虑如何覆盖每个部分。我们可以将每个部分看作一个2×2的小棋盘,其中必定有一个特殊点。对于每个小棋盘,我们可以选择放置一个L型骨牌,使得它覆盖除特殊点以外的所有方格。这样做的前提是特殊点所在的行和列中必须有一条直线可以被覆盖,否则无法放置L型骨牌。由于每个小棋盘都是相互独立的,因此我们只需要考虑一种小棋盘的覆盖方法。 假设小棋盘的特殊点在左上角,那么我们只有2种情况可以将它覆盖:一种是放置一个横向的L型骨牌,另一种是放置一个竖向的L型骨牌。对于横向的L型骨牌,它必须覆盖特殊点所在的行和下面一行,同时覆盖右边两列的任意一个方格;对于竖向的L型骨牌,它必须覆盖特殊点所在的列和右边一列,同时覆盖下面两行的任意一个方格。 综上所述,我们可以先判断特殊点所在的行和列是否满足条件,如果满足则分别考虑横向和竖向的L型骨牌是否可以放置,如果都不行则无解。如果存在解,则我们可以采用递归的方式,将整个棋盘分成4个部分,分别求解每个部分的覆盖方案。最后将4个部分的方案合并起来即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值