• 骨牌覆盖问题 KxM


     前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的

    思路和上一篇文章所提到的3*N的 很类似;

    依然是矩阵快速幂。我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂,要进行矩阵快速幂,我们需要知道初始矩阵,与构造出的递推矩阵;


    我们如何得到这两个矩阵?

    初始矩阵:矩阵宽度为 2^n  次方;第一排只可能出现,0或者横着放置,不过我们可以再退一步,第0行时,的状态,我们只能够看做全部填满。最初状态是最后一个为1;所以这样我们就得到了初始矩阵。


    递推矩阵怎么得到:?


    让我们再回头看看我们上一期提示里面放置骨牌的约定:
    假设我们正在放置第i行的骨牌,那么会有下面3种方式:
       

    灰色表示已经有的骨牌,绿色表示新放置的骨牌。
    每一种放置方法解释如下,假设当第i行的状态为x,第i-1行的状态为y:


    第i行不放置,则前一行必须有放置的骨牌。x对应二进制位为0,y对应二进制位为1。
    第i行竖放骨牌,则前一行必须为空。x对应二进制位为1,y对应二进制位为0。
    第i行横向骨牌,则前一行必须两个位置均有骨牌,否则会产生空位。x对应二进制位为1,y对应二进制位为1。
    既然有对应的二进制描述,那么上面三种方法就可以用程序语言解释为:


    •第i行不放置:new_x = x << 1, new_y = (y << 1) + 1; 列数+1
    •第i行竖放骨牌:new_x = (x << 1) + 1, new_y = y << 1; 列数+1
    •第i行横向骨牌:new x = (x << 2) + 3, new_y = (y << 2) + 3; 列数+2
    通过迭代去枚举3种放置方法,当总的列数等于K时,此时的x便可由y转移过来。那么我们可以得到枚举放置的代码:

    void dfs(int x,int y ,int deep,Mat& a)
    {
        if(deep>_k) return ;
        if (deep==_k)
        {
            a.maze[y][x]=1;
            return ;
        }
        dfs(x<<1,(y<<1)+1,deep+1,a);
        dfs((x<<1)+1,y<<1,deep+1,a);
        if (deep+2<=_k) dfs((x<<2)+3,(y<<2)+3,deep+2,a);
    }

    OVER....


  • 相关阅读:
    BZOJ 2789: [Poi2012]Letters 树状数组 + 逆序对
    luogu 5468 [NOI2019]回家路线 最短路/暴力
    BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包
    练手爬虫用urllib模块获取
    django安装以及配置
    web框架
    模拟百度进行图片搜索,有问题可以留言
    深入requests库params|data|json参数
    深入理解http1.x、http 2和https
    nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7207969.html
Copyright © 2020-2023  润新知