分享好友 最新动态首页 最新动态分类 切换频道
hackenzheng
2024-12-26 18:09

hackenzheng

枚举摆放的这一步可以采用dfs递归枚举列,递归出口为列数col == N时。dfs函数的原型可以写成如下的形式:
       void dfs( int col, int nextrow, int nowstate, int nextstate, LL cnt);
       // col       表示当前枚举到的列编号
       // nextrow   表示下一行的行编号
       // nowstate  表示当前枚举骨牌摆放时第i  行的状态(随着放置骨后会更新)
       // nextstate 表示当前枚举骨牌摆放时第i+1行的状态(随着放置骨后会更新)
       // cnt       状态转移前的方案数,即第i行在放置骨牌前的方案数
       然后再来看如何将骨牌摆上去,这里对骨牌进行归类,旋转之后得到如下六种情况:
图二-4-6
图二-4-7
       为了方便叙述,分别给每个类型的骨牌强加了一个奇怪的名字,都是按照它自身的形状来命名的,o(╯□╰)o。然后我们发现它们都被圈定在一个2X2的格子里,所以每个骨牌都可以用2个2位的2进制整数来表示,编码方式类似上面的状态表示法(参照图6,如果骨牌对应格子为蓝色则累加格子上的权值),定义如下:
 
int blockMask[6][2] = {
     {1, 1},    // 竖向2X1
     {3, 0},    // 横向1X2
     {3, 1},    // 枪
     {3, 2},    // 7
     {1, 3},    // L
     {2, 3},    // J
};
       blockMask[k][0]表示骨牌第一行的状态,blockMask[k][1]表示骨牌第二行的状态。这样一来就可以通过简单的位运算来判断第k块骨牌是否可以放在(i, col)这个格子上,这里的i表示行编号,col则表示列编号。接下来需要用到位运算进行状态转移,所以先介绍几种常用的位运算:
       a. x & (1<<i)   值如果非0,表示x这个数字的二进制表示的第i(i >= 0)位为1,否则为0;
       b. x & (y<<i)   值如果非0,表示存在一个p(i <= p < i+k),使得x这个数字的二进制表示的第p位和y的p-i位均为1(k为y的二进制表示的位数);
       c. x | (1<<i)   将x的第i位变成1(当然,有可能原本就为1,这个不影响);
       d. x | (y<<i)   将x的第i~i+k-1位和y进行位或运算(k为y的二进制表示的位数),这一步就是模拟了骨牌摆放
       那么这个格子可以放置第k个骨牌的条件有如下几个:
       1、当前骨牌横向长度记为w,那么w必须满足 col + w <= N,否则就超出右边界了。
       2、 nowstate (blockMask[k][0]<<col)  == 0,即第i行,骨牌放入前对应的格子为空(对应的格子表示骨牌占据的格子,下同)
       3、nextstate (blockMask[k][1]<<col)  == 0,即第i+1行,骨牌放入前对应的格子为空
       4、最容易忽略的一点是,“J”骨牌放置时,它的缺口部分之前必须要被骨牌铺满,否则就无法满足第i行全铺满这个条件了,如图二-4-8所示的情况。
图二-4-8
 
       当四个条件都满足就可以递归进入下一层了,递归的时候也是采用位运算,实现如下:
       dfs( col+1, nextrow, nowstate|(blockMask[k][0]<<col), nextstate|(blockMask[k][1]<<col), cnt );
       这里的位或运算(|)就是模拟将一个骨牌摆放到指定位置的操作(参见位运算d)。
       当然,在枚举到第col列的时候,有可能(i, col)这个格子已经被上一行的骨牌给“占据”了(是否被占据可以通过 (1<<col) & nowstate 得到),这时候我们只需要继续递归下一层,只递增col,其它量都不变即可,这表示了这个格子什么都不放的情况。
最新文章
揭秘苹果SEO策略,助力企业登顶市场高峰
本文深入解析苹果SEO策略,从关键词优化、内容创作、链接建设等方面阐述如何提升苹果产品在搜索引擎中的排名,助力企业抢占市场先机,实现线上营销目标。通过掌握苹果SEO核心技巧,企业可以提升品牌影响力,吸引更多潜在客户,实现业绩增长
超长待机智能手机有哪些?最新超长待机智能手机推荐
  导语:在我们日益追逐手机的外观和屏幕尺寸的时候,手机电池的续航能力也逐渐的暴漏出来,尤其是智能手机,单吃的续航能力更是前所未有的差,一方面也是因为智能手机索要运行的程序比较多,另一方面手机的屏幕大也就造成了手机的电池不
热捧人工智能需防泡沫
“十大职业的终结者”“划时代意义的应用”……似乎在一夜之间,ChatGPT家喻户晓,成为当下最热门的话题之一,吸金无数。 ChatGPT概念的走红,背后有相应的技术支撑和社会对人工智能的现实需求,也少不了资本的推波助澜。相关数据显示,1月
米家PC客户端v10.0.707官方最新版
米家PC客户端可以让你在电脑上通过安卓模拟器操控家里的小米智能硬件设备,你可以通过小米智能家庭来实现电脑与家里的智能硬件设备交互,让你可以远程控制它们,还可以把设备分享给家人,一起享受便捷温馨的智能生活。它不仅连接旗下的生态
【乔丹QQ同步助手下载】Moto 乔丹QQ同步助手8.0.14免费下载
* 国内知名数字生活媒体AppSo推荐【QQ同步助手,备份你的手机生活!】换手机必备神器!手机资料自动备份,安全保护防丢失!一键备份手机通讯录、软件、文档到云端的超实用工具!------手机随便换,资料不丢失------ 【智能管理通讯录】备份
挖矿处置手册
什么是挖矿木马?攻击者通过各种手段将挖矿程序植入受害者的计算机中,在受害者不知情的情况下利用其计算机的云算力进行挖矿,从而获取利益,这类非法植入用户计算机的挖矿程序就是挖矿木马。挖矿木马,挖的是啥?由于比特币的成功,许多基
如何创作出吸引人的新媒体运营实习作品?
在新媒体运营的实习过程中,我有幸参与并负责了一系列的项目,这些项目不仅锻炼了我的专业技能,还让我对新媒体运营有了更深入的理解,以下是我在实习期间完成的几个主要作品及其详细介绍:1、背景与目标:公司希望提升其品牌在社交媒体上
今日头条:云南京华医院可信吗{高品质妇科}昆明妇科医院哪家好?
现在的女性朋友一不小心就会被女性疾病盯上!所以说,生活中*要注意养成一个良好健康的生活习惯!女性每年都进行一到两次的妇科检查十分必要,可以做到对于一些妇科疾病的早发现,早治疗。 下面就是常规妇科检查项目的介绍。妇科检查是女性每
WordPress建站必知必会
建立一个WordPress网站需要掌握一些基本的知识和技能。以下是一些关键的必备知识点: WordPress基础: 了解WordPress是什么,以及它为什么如此流行。WordPress是一个内容管理系统(CMS),允许你轻松地创建和
相关文章
推荐文章
发表评论
0评