棋盘覆盖问题

题目描述:

          

   在一个2k´2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊(残缺)方格,且称该棋盘为一特殊棋盘。

  根据特殊方格出现的位置,有种 4k不同的特殊棋盘。

  棋盘覆盖问题:4 种不同形态的 L 型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个 L 型骨牌不得重叠覆盖。

  

  

分治法:2k´2k棋盘覆盖问题--42k-1´2k-1棋盘覆盖问题

将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1

int  tr;	// 棋盘左上角方格所在行号 
int  tc;	// 棋盘左上角方格所在列号 
int  dr;	//残缺方格所在行号 
int  dc;	//残缺方格所在列号 		
int  size;	// 棋盘行数列数 
int  s;		//子棋盘行列数 
int  t;		// 用于覆盖子棋盘交界处的格板编号 
全局变量:
int  tile;	//用于覆盖的 L 型三格板的编号 
int  B[n][n];// 棋盘每个方格所覆盖的 L 型三格板的编号  
void tileboard(int tr, int tc, int dr, int dc, int size)
  {
     int t, s;
     if (size==1) return;
     tile = tile + 1;	t = tile;	
     s = size / 2;
     if ( (dr<tr+s)  &&  (dc<tc+s) )	   /* 处理左上象限 */
          tileboard(tr, tc,  dr, dc, s);	   /*残缺方格位于本象限,覆盖*/
     else {
        B[tr+s-1][tc+s-1] = t;       /*右下角方格置三格板t */
        tileboard(tr,  tc, tr+s-1, tc+s-1,  s);  /* 覆盖其余方格 */
    }
     if ((dr<tr+s) && (dc>=tc+s))	 /* 处理右上象限 */
        tileboard(tr,tc+s,dr,dc,s)  /*残缺方格位于本象限,覆盖*/
    else {
         B[tr+s-1][tc+s] = t;	/* 否则,左下角方格置三格板t */
         tileboard(tr,tc+s,tr+s-1,tc+s,s);        /* 覆盖其余方格 */
    }
    if ((dr>=tr+s) && (dc<tc+s))	       /* 处理左下象限 */
        tileboard(tr+s,tc,dr,dc,s);/*残缺方格位于本象限,覆盖*/
    else {
        B[tr+s][tc+s-1] = t;	/* 否则,右上角方格置三格板t */
        tileboard(tr+s,tc,tr+s,tc+s-1,s);     /* 覆盖其余方格 */
    }
  if ((dr>=tr+s) && (dc>=tc+s))	/* 处理右下象限 */
     tileboard(tr+s,tc+s,dr,dc,s); /*残缺方格位于本象限覆盖*/
  else {
         B[tr+s][tc+s] = t;		/* 否则,左上角方格置三格板t */
        tileboard(tr+s,tc+s,tr+s,tc+s,s);   /* 覆盖其余方格 */
    }
 }



### 回答1: 这句话说的是,在一个2k x 2k个方格组成的棋盘中,恰好有一个方格与其他的不同名为特殊方格,想要利用四种l型骨牌(每个骨牌可覆盖三个方格)不相互重叠覆盖的将除了特殊方格外的其他方格覆盖掉,就会除了特殊方格外的其它方格覆盖的将再也没有特殊方格外的其它方格覆盖。 ### 回答2: 这道题目是一个经典的计算几何问题,需要运用数学的思维去解决。我们可以将这个2k x 2k的棋盘抽象成为一个坐标系,其中特殊方格的坐标设为(x0, y0)。然后我们考虑如何使用四种L型骨牌去覆盖这个棋盘。 首先,我们可以发现,除了特殊方格外,每个方格都需要被覆盖。而每个骨牌恰好可以覆盖3个方格,因此我们需要使用k^2-1个骨牌去覆盖这个棋盘。由于骨牌可以旋转和翻转,因此我们可以只考虑一种骨牌的情况。 对于这种L型的骨牌,可以将其拆分成两个1x2的小矩形和一个1x1的小正方形。因此,我们可以将整个棋盘分成两种类型的小正方形:一个包含特殊方格,另一个不包含特殊方格。对于第一种小正方形,我们可以用一种特殊的骨牌来覆盖;对于第二种小正方形,我们可以用如下方式进行覆盖: 首先,我们将这个棋盘看作是由2x2的小正方形组成的。我们可以将这些小正方形分成两种类型:一个包含特殊方格,另一个不包含特殊方格。对于第一种小正方形,我们可以用一种特殊的骨牌来覆盖;对于第二种小正方形,我们可以用如下方式进行覆盖: 以特殊方格所在的小正方形为中心,选取4个不同的方向(上、下、左、右),将相邻的一个小正方形标记为'A',再从'A'所在的位置标记一个新的小正方形为'B',以此类推,一直延伸到边界。这样,我们可以将整个棋盘分成若干个类似于倒L形的组合。对于每个组合,我们可以使用如下的方式进行覆盖: 1. 将中间的小正方形用一块骨牌覆盖; 2. 将左上、左下、右上三个小正方形用一块骨牌覆盖; 3. 将右边缘与下边缘上的小正方形用一块骨牌覆盖。 这样,我们就可以用L型骨牌将整个棋盘覆盖,且不会出现重叠的情况。 综上所述,在棋盘中恰有一个特殊方格的情况下,我们可以用四种L型骨牌将除了特殊方格外的所有方格覆盖。这个过程虽然需要一些数学技巧,但是本质上还是一道有趣的智力题,可以锻炼我们的数学思维。 ### 回答3: 本题是一个经典的数学问题——二维多米诺骨牌问题。虽然看上去比较困难,但是可以通过一些简单的数学分析进行求解。 首先,我们可以证明这个问题的解一定存在。因为2k x 2k的棋盘中不算特殊方块共有(2k x 2k - 1)个方块,而L型骨牌每次可以覆盖3个方块,因此需要覆盖[(2k x 2k - 1) / 3]个骨牌。而每个骨牌有两种方向,因此总共需要[(2k x 2k - 1) / 3] x 2个骨牌。而经过简单计算可以得到[(2k x 2k - 1) / 3] x 2是一个整数,也就是说,存在一个完美解。 接下来是具体的构造方法。我们可以将2k x 2k的棋盘分成不同的3 x 3的小块。每个小块内部可以用3个L型骨牌覆盖,构造出一个三角形状的覆盖方式。而每个小块之间的L型骨牌则可以连接起来,构成一条路径。我们发现,不难证明,在这条路径上,每个小块的两个我们没有使用L型骨牌覆盖的方块一定不同(也就是不在同一行或同一列),而且这些小块的两个未覆盖方块恰好可以用一个L型骨牌覆盖。因此我们只需要在路径上覆盖这些未覆盖的方块即可。 接下来考虑如何覆盖特殊方块。我们假设特殊方块在一个小块内部,并且这个小块我们已经用3个L型骨牌覆盖。那么我们只需要将这三个骨牌中的任意一个换成一块含有特殊方块的L型骨牌即可。如果特殊方块在某两个相邻的小块交界处,则我们可以将这两个小块的路径之间的骨牌换成覆盖特殊方块的骨牌即可。 因此,我们成功地证明了,对于大小为2k x 2k的棋盘,存在一种可行方案,使用L型骨牌覆盖其中的所有方块,并且只留下一个特殊方块未被覆盖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值