• Hardwood floor


    题目大意:用 2*1 或者2*2-1的格子覆盖M*N的矩阵,有多少种覆盖方式。

    分析:容易知道有以下6种放置方式。

    然后用深搜的方法直接搞出来就行了,不过要使用两个变量来判断本位是否受影响。如果本行的放置可以影响上一行,比如(1,3,4,5,6)那么所影响的位置为0,如果没有受到影响那么就是1。

    代码如下:

    =====================================================================================================================

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    
    const int MAXN = 12;
    const int Bit = 9;
    
    long long dp[MAXN][1<<Bit];
    int M, N;
    
    void DFS(int row, int col, int now, int pre, bool uNow, bool uPre)
    {///row表示所在行,col表示列,now表示本行的状态,pre表示上一行的状态
     ///uNow uPre表示本列和上一列是否收到影响,1表示受影响,0表示没有
        if(col == N)
        {
            if(!uNow && !uPre)
                dp[row][now] += dp[row-1][pre];
            return ;
        }
    
        if(!uNow)
        {
            if(!uPre)
            {
                DFS(row, col+1, now<<1|1, pre<<1, 0, 0);
                DFS(row, col+1, now<<1|1, pre<<1, 1, 0);
                DFS(row, col+1, now<<1|1, pre<<1, 0, 1);
            }
            DFS(row, col+1, now<<1|1, pre<<1|(!uPre), 1, 0);
            DFS(row, col+1, now<<1|1, pre<<1|(!uPre), 1, 1);
        }
        if(!uPre)
            DFS(row, col+1, now<<1|uNow, pre<<1, 1, 1);
        DFS(row, col+1, now<<1|uNow, pre<<1|(!uPre), 0, 0);
    }
    
    int main()
    {
        scanf("%d%d", &M, &N);
    
        dp[0][(1<<N)-1] = 1;
        for(int i=1; i<=M; i++)
            DFS(i, 0, 0, 0, 0, 0);
    
        printf("%lld
    ", dp[M][(1<<N)-1]);
    
        return 0;
    }
  • 相关阅读:
    谈执着
    SQL表自连接用法
    Mysql group by 排序问题
    php自动生成mysql的触发代码。
    XSS CSRF 攻击
    [微信开发利器]微信内移动前端开发抓包调试工具fiddler使用教程
    微信JS-SDK]微信公众号JS开发之卡券领取功能详解
    优化与重构的思考
    c语言 13
    c语言 13
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4853251.html
Copyright © 2020-2023  润新知