分治法:棋盘覆盖问题

1、 分治法

摘自中科大算法导论课程资料 :
当求解的问题较复杂或规模较大时,不能立刻得到原问题的解,但这些问题本身具有这样的特点,它可以分解为若干个与原问题性质相类似的子问题,而这些子问题较简单可方便得到它们的解,因此通过合并这些子问题的解就可得到原问题的解。

2、思路:
1)将问题分解为规模更小的子问题;
2)解决这些子问题;
3)将已解决的子问题合并,求出原问题的解。

3、经典例子:
快速排序,归并排序等

棋盘覆盖问题
给定一个长宽均为为2^n 个小方格的棋盘,其中有一个位置已经被填充,现在要用一个L型(2*2个小方格组成的大方格中去掉其中一个小方格)形状去覆盖剩下的小方格,要求任何2个L型骨牌不得重叠覆盖。

这里讲的很清楚:棋盘覆盖问题及讲解

这里题目有所变化:
输入第一行为测试用例个数,后面每一个用例有两行,第一行为n值和特殊的格子的坐标(用空格隔开),第二行为需要查找其属于同一个L型骨牌的格子坐标。
输入:

1
1 1 1
0 0

输出:

0 1,1 0

#include <iostream>
#include <math.h>

using namespace std;

//sx,sy为特殊格的坐标,dx,dy为要查找的格子的坐标
//lx,ly为每次迭代左上角的格子的坐标,与size共同确定当前迭代的棋盘范围
int dx,dy;
int num;

void Board(int ** &a,int sx,int sy,int lx,int ly,int size){
   
   
    if(size==1)
        return ;
    int no=num+1;
    num++;
    int s=size/2;
    if(sx<lx+s && sy<ly+s)
        Board(a,sx,sy,lx,ly,s);
    else{
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值