分治算法---棋盘覆盖

分治算法—-棋盘覆盖
在一个2^k*2^k组成的棋盘中若恰有一个方格与其他方格不同,则称这个方格为特殊方格,在棋盘覆盖问题中,要用不同形态的L型骨牌覆盖在一个给定的特殊棋盘上 除了特殊方格上的所有方格,且各个骨牌不得重复覆盖
将棋盘均分四份,特殊方格必然位于四个较小的棋盘中,其余三个子棋盘中无特殊方格,我们直接利用一个L型骨牌覆盖这三个较小棋盘的交汇处,从而将问题转化为四个较小规模的棋盘覆盖问题。

#include 
#include 
#define Board_size 4//该棋盘矩阵的维度
using namespace std;
int tile=1;
int Board[Board_size][Board_size];//声明该棋盘矩阵
void ChessBoard(int tr,int tc,int dr,int dc,int size)
//tr,tc为最左上角的坐标,dr,dc为特殊方块所在的坐标,size为该棋盘的规模
{
    if(size == 1)
        return;
    //定义L型骨牌号的初始使用标号
    int t = tile++;//L型骨牌号
    int s=size/2;//分割棋盘

//覆盖左上角子棋盘
    if(dr//特殊方格在此棋盘中
    ChessBoard(tr,tc,dr,dc,s);
    else//此棋盘中没有特殊方格
    {
//用t号L型骨牌覆盖右下角
        Board[tr+s-1][tc+s-1]=t;
//覆盖其余方格
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
     }

//覆盖右上角子棋盘
    if(dr>=tr+s && dc//特殊方格在此棋盘中
        ChessBoard(tr,tc+s,dr,dc,s);
    else // 不在此棋盘,将此棋盘左下角设为相应的骨牌号
    {
//用t号L型骨牌覆盖左下角
        Board[tr+s][tc+s-1]=t;
//覆盖其余方格
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
    }

//覆盖左下角子棋盘
    if(dr=tc+s)
//特殊方格在此棋盘中
        ChessBoard(tr+s,tc,dr,dc,s);
    else//此棋盘中没有特殊方格
    {
//用t号L型骨牌覆盖右上角
        Board[tr+s-1][tc+s]=t;
//覆盖其余方格
        ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
    }

//覆盖右下角子棋盘
    if(dr>=tr+s && dc>=tc+s)
//特殊方格在此棋盘中
        ChessBoard(tr+s,tc+s,dr,dc,s);
    else//此棋盘中没有特殊方格
    {
//用t号L型骨牌覆盖左上角
        Board[tr+s][tc+s]=t;
//覆盖其余方格
        ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }

}
int main(){
    Board[2][2] =0 ;//初始状态下特殊方格坐标为Board[0][0]
    ChessBoard(0,0,2,2,Board_size);//Board_size
    for(int i=0;i//输出骨牌覆盖后的棋盘矩阵
        for(int j=0;jcout<<"  "<cout<cout<1;
    return 0;
} 

你可能感兴趣的:(算法设计)