骨牌覆盖问题 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....
骨牌覆盖问题 KxM的更多相关文章
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
- hiho #1151 : 骨牌覆盖问题·二 (递推,数论)
#1151 : 骨牌覆盖问题·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题? ...
- hiho #1143 : 骨牌覆盖问题·一 (运用快速幂矩阵)
#1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...
- hiho42 : 骨牌覆盖问题·二
描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢?首先我们可以肯定, ...
- hiho41 : 骨牌覆盖问题·一
原问题:骨牌覆盖问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然后用1x2的 ...
- hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)
http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...
- 1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖
1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个 ...
- 【hdu6185】Covering(骨牌覆盖)
2017ACM/ICPC广西邀请赛-重现赛1004Covering 题意 n*4的格子,用1*2和2*1的砖块覆盖.问方案数(mod 1e9+7).(n不超过1e9) 题解 递推了个式子然后错位相减. ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
随机推荐
- angular http ajax header
myAppModule.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common ...
- Android自己定义实现循环滚轮控件WheelView
首先呈上效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- angular - 新建项目 - 2
ng new testNg 新建项目后,从网络上拉取模板(最后缓存下来,我们下次创建项目的时间将会减少80%) 安装过程中,需要我们提供Git账号和姓名 最后,我们进入 useNg 然后,启动服务器 ...
- Android——滑动事件冲突解决
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件. android系统中的每个View的子类都具有下面三个与TouchEvent处理密切相关的方法: (1) ...
- Azure Mobile App - Custom Authentication
Custom Authentication: 1. For OLD Mobile Service - https://azure.microsoft.com/en-us/documentation/a ...
- 转:学习linux驱动经典书籍
Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本 ...
- mdadm
http://en.wikipedia.org/wiki/Mdadm mdadm From Wikipedia, the free encyclopedia mdadm Original au ...
- sublime 汇总
此文内容有原创,还有各种其他博客抄来的经验,技巧,纯属个人使用心得. http://www.cnblogs.com/figure9/p/sublime-text-complete-guide.html ...
- Android------Intent.createChooser
Intent的匹配过程中有三个步骤,包含Action , category与data 的匹配. 假设匹配出了多个结果.系统会显示一个dialog让用户来选 择.例如以下图: 那么今天我们主要是解 ...
- python--软件规范和反射
软件开发规范 写一个作业的时候,要将写的代码分开 bin文件夹里面第一个是start文件 核心代码都在core文件夹里面 文件core最好也是固定名字 BaseDir=os.path.dirna ...