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{