骨牌覆盖问题 KxM

摘要:
我们前面提到了一些简单的多米诺骨牌覆盖问题。有了以上经验,我们可以尝试解决K*M的想法,这些想法与前一篇文章中提到的3*N非常相似;它仍然是矩阵的快速幂。我们需要将一条小边固定为的已知边,然后对矩阵进行快速幂运算。为了对矩阵进行快速幂运算,我们需要知道初始矩阵和构造的递归矩阵;我们如何得到这两个矩阵?如何获取递归矩阵:?如果多米诺骨牌垂直放置在第i行,则前一行必须为空。

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

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

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


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

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


递推矩阵怎么得到:?


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

灰色表示已经有的骨牌,绿色表示新放置的骨牌。
每一种放置方法解释如下,假设当第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....


免责声明:文章转载自《骨牌覆盖问题 KxM》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mac 安装配置 tomcatiphone手机与PC蓝牙出现感叹号且无法修复解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jenkins全局安全设置

         如何进入安全设置界面          在Jenkins的主界面,点击 configure Global Security 选项,进入Jenkins的系统安全设置界面。安全界面如下图。在这里我们分别介绍各个选项的功能。            启用安全          启用安全,如果启动此项,你必须使用用户名/密码登录才能配置和执行构建...

python 根据二维数组画出彩色图像

方法:采用seaborn中的heatmap importseabornimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltnew_show=pd.DataFrame(new_show) fig=plt.figure seaborn.heatmap(new_show) plt...

网络游戏的前后端通讯(一)

【旧博客转移 - 发布于2015年9月14日 22:25】   通讯是网络游戏的最重要部分之一,好的游戏通讯协议设计包括一下特点:包体积小、解析速度快、支持加解密等等,下面就简单说一下通讯协议的设计 1.游戏中常用的通讯协议以及数据格式 HTTP:     早期的SLG游戏一般会采用HTTP协议进行通讯,后端大多采用PHP,通讯格式用XML、JSON等字符...

Numpy入门学习之(二)linalg库----向量范数、矩阵范数、行列式、矩阵逆、幂

转自:https://blog.csdn.net/qq_30138291/article/details/76327051   老师课堂总结,请勿转载 Numpy中的核心线性代数工具 numpy.linalg模块包含线性代数的函数。使用这个模块,我们可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。 求解矩阵的范数 在实数域中,数的大小和两个数之间的...

Jmeter入门13 jmeter发送application/octet-stream二进制流数据

http接口请求header里面 content-type:application/octet-stream (二进制流数据),如何用jmeter发送请求? 1添加http请求头 2http请求files upload里面写上文件的绝对地址 发送的文件内容:1 由开发提供的文件 2有的是通过fiddler抓包获取的二进制流拷贝到文件里保存 theend...

Java AES加密解密工具 -- GUI 、在线传输文件

原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。分组之后将分别对每个128位的明文分组进行加密。 对于每个128位长度的明文分组的加密过程如下: (1)将128位AES明文分组放入状态矩阵中。 (2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。...