一道很有趣的递归与分治的题目。
关键搞好各个位置的下标关系,以及将整个图分为四部分,如果特殊点不在此部分,则将整个图中间的三个方块标记为特殊点。注释很详细。
画了一张图(主要是还得交作业,不然才不画呢,哈哈哈哈):
先贴上递归实现的代码:
/*
棋盘覆盖的递归算法
棋盘大小为size(2^k)*size大小
*/
#include<iostream>
const int Max=16;
int map[Max][Max];
using namespace std;
int tile;
void ChessBoard(int lr,int lc,int dr,int dc,int size)
{
if(size==1)return;
//L型骨牌号
int cnt=++tile;
int s=size/2;
//处理左上角部分
if(dr<lr+s&&dc<lc+s)//如果特殊方格在左上角
{
ChessBoard(lr,lc,dr,dc,s);
}
else //骨牌覆盖到右下角
{
map[lr+s-1][lc+s-1]=cnt;
ChessBoard(lr,lc,lr+s-1,lc+s-1,s);
}
//处理右上角部分
if(dr<lr+s&&dc>=lc+s)
{
ChessBoard(lr,lc+s,dr,dc,s);
}
else//覆盖到左下角
{
map[lr+s-1][lc+s]=cnt;
ChessBoard(lr,lc+s,lr+s-1,lc+s,s);
}
//处理左下角部分
if(dr>=lr+s&&dc<lc+s)
{
ChessBoard(lr+s,lc,dr,dc,s);
}
else//覆盖到右上角
{
map[lr+s][lc+s-1]=cnt;
ChessBoard(lr+s,lc,lr+s,lc+s-1,s);
}
//处理右下角部分
if(dr>=lr+s&&dc>=lc+s)
{
ChessBoard(lr+s,lc+s,dr,dc,s);
}
else//覆盖到左上角
{
map[lr+