棋盘覆盖(分治加递归)

题目是紫书上的,这里就不写了,大概的意思就是要用L型骨牌去覆盖2的k次乘2的k次方的棋盘,棋盘中有一个特殊点不能被覆盖。最气的是代码写错一个字母要看半天,阅读感实在太差。

#include
#include
#include
using namespace std;
int Lcount=0;
int Matrix[100][100];
//递归加分治
void chessBoard(int tr,int tc,int dr,int dc, int _size)//toprow,topcol
{
        int s,t;
        if(_size==1) return ;
        s=_size/2;
        t=++Lcount; //这就是放在中间的那个骨牌
        //top left
        if(dr-tr         {
                chessBoard(tr,tc,dr,dc,s);
        }
        else
        {
                Matrix[tr+s-1][tc+s-1]=t;
                chessBoard(tr,tc,tr+s-1,tc+s-1,s);
        }
        //top right
        if(dr-tr=s)
        {
                chessBoard(tr,tc+s,dr,dc,s);
        }
        else
        {
                Matrix[tr+s-1][tc+s]=t;
                chessBoard(tr,tc+s,tr+s-1,tc+s,s);
        }
        //bottom left
        if(dr-tr>=s&&dc-tc         {
                chessBoard(tr+s,tc,dr,dc,s);
        }
        else
        {
                Matrix[tr+s][tc+s-1]=t;
                chessBoard(tr+s,tc,tr+s,tc+s-1,s);
        }
        //bottom right
        if(dr-tr>=s&&dc-tc>=s)
        {
                chessBoard(tr+s,tc+s,dr,dc,s);
        }
        else
        {
                Matrix[tr+s][tc+s]=t;
                chessBoard(tr+s,tc+s,tr+s,tc+s,s);
        }
}
int main()
{
        int _size,row,col;
        while(cin>>_size>>row>>col)
        {
                memset(Matrix,0,sizeof(Matrix));
                chessBoard(0,0,row,col,_size);
                for(int r=0;r<_size;r++)
                {
                        for(int c=0;c<_size;c++)
                                cout<                         cout<                 }
        }
        return 0;
}


你可能感兴趣的:(二分,递归)