[分治]棋盘覆盖

本文介绍了一个利用分治思想解决2^k * 2^k棋盘覆盖问题的方法,其中棋盘有一个黑色方格,目标是用L型骨牌覆盖所有白色方格。通过将棋盘划分为四分之一大小的子问题,并根据黑格位置选择不同的递归策略,最终完成覆盖。递归过程中,将无黑格的子盘转化为特殊棋盘,并确保每个白色方格仅被一个骨牌覆盖。
摘要由CSDN通过智能技术生成

问题描述

有一个2 ^ k ∗ 2 ^ k的方格棋盘,恰有一个方格是黑色的,其他为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。如图所示为L型牌的4种旋转方式。
在这里插入图片描述

输入

输入有多组测试实例,第一行是k(1<=k<=10),第二行是黑色方哥所在的位置坐标(x,y)(0<=x,y<1024)

输出

边长为2^k的方阵,黑色方格的编号为0,所有L型牌从1开始连续编号,数据之间用Tab键隔开。

输入样例

2
0 1

输出样例

1	0
1	1

分析

利用分治的思想将原问题划分为规模较小的子问题进行求解,每次将棋盘分为原来的1/4,黑格必定位于四个小格中的一个,再将有黑格的那一块递归解决,之后构造出一个大黑格,将例外三个无黑格的子盘转化为特殊棋盘,即用一个L型骨牌覆盖这3个棋盘的交汇处。直至棋盘化为1*1规格,此时只需要一块L型骨牌填充即可。

  1. 如果黑格在左上子盘,递归填充左上子盘;否则填充左上子盘的右下角(交汇处),将右下看做黑格,递归填充左上子盘
  2. 如果黑格在右上子盘,递归填充右上子盘;否则填充右上子盘的左下角(交汇处),将右下看做黑格,递归填充右上子盘
  3. 如果黑格在左下子盘,递归填充左下子盘;否则填充左下子盘的右上角(交汇处),将右上看做黑格,递归填充左下子盘
  4. 如果黑格在右下子盘,递归填充右下子盘;否则填充右下子盘的左上角(交汇处),将左上看做黑格,递归填充右下子盘
#include <iostream>
using namespace std;

int tile = 1;
int board[100][100];	//棋盘,tr,tc为左上行列号,dr,dc为右下行列号

void chessboard(int tr, int tc,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值