棋盘覆盖问题

棋盘覆盖

在一个2k×2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
易知,覆盖任意一个2k×2k的特殊棋盘,用到的骨牌数恰好为(4K-1)/3。
方格1表格2
输入:第一行为k(棋盘的尺寸),第二行为x,y(1<=x,y<=2^k),分别表示特殊方格所在行与列。
输出:共2^k行,分别表示覆盖该格的L型的编号(特殊格用0表示)。
例:
输入: 输出:
2 1 0 2 2
1 2 1 1 3 2
4 3 3 5
4 3 3 5
在这里插入图片描述在这里插入图片描述
由棋盘的尺寸为2^k * 2^k, 我们可以想到将其分割成四个尺寸为2^k-1 * 2^k-1的子棋盘。可是由于含特殊方格的子棋盘与其他子棋盘不同,问题还是没有解决。
经过思考,我们发现只要将L型如图放置在棋盘的中央,就可以使四个棋盘都变成特殊棋盘。此时问题也变成四个相同的子问题,运用递归就可以解决这个问题了。

当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。
在这里插入图片描述在这里插入图片描述

算法思想

用分治策略,可以设计出解棋盘覆盖问题的简介算法。
(1)当k>0时,将2的k次幂乘以2的k次幂棋盘分割为4个2的k-1次幂乘以2的k-1次幂子棋盘。
(2)特殊方格必位于4个较小棋盘之一中,其余3个子棋盘中无特殊方格。
(3)为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的汇合处,这3个子棋盘被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为1*1棋盘。

下面介绍棋盘覆盖问题中数据结构的设计:
(1)棋盘:用二维数组board[size][size]表示一个棋盘,其中size=2^k.为了在递归处理的过程中使用同一个棋盘,将数组board设为全局变量
(2)子棋盘:在棋盘数组board[size][size]中,由子棋盘左上角的下标tr,tc和棋盘边长s表示
(3)特殊方格:用board[dr][dc]表示,dr和dc是该特殊方格在棋盘数组board中的下标
(4)L型骨牌:一个2^k *2k的棋盘中有一个特殊方格,所以,用到L型骨牌的个数为(4k-1)/3,将所有L型骨牌从1开始连续编号,用一个全局变量t表示。

说明:
整形二维数组Board表示棋盘,Borad[0][0]使棋盘的左上角方格。
tile是一个全局整形变量,用来表示L形骨牌的编号,初始值为0。
tr:棋盘左上角方格的行号;
tc:棋盘左上角方格的列号;
dr:特殊方各所在的行号;

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值