棋盘覆盖问题及其时间复杂度计算

使用分治法解决棋盘覆盖问题

#include<iostream>
using namespace std;

const int SIZE=4;
static int Board[SIZE][SIZE]={0};
static int title=1;

int ChessBoard(int tr,int tc,int dr,int dc,int size)
{

    if(size == 1)  return 0;//这里虽然书上和网络上都没有返回值,但是在我这里的编译器都不通过

    int t=title++;
    int s=size/2;

    if(dr<tr+s && dc<tc+s)
    {
        ChessBoard(tr,tc,dr,dc,s);
    }
    else
    {
        Board[tr+s-1][tc+s-1]=t;
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
    }

     if(dr<tr+s && dc>=tc+s)
    {
        ChessBoard(tr,tc+s,dr,dc,s);
    }
    else
    {
        Board[tr+s-1][tc+s]=t;
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
    }

    if(dr>=tr+s && dc<tc+s)
    {
        ChessBoard(tr+s,tc,dr,dc,s);
    }
    else
    {
        Board[tr+s][tc+s-1]=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
    {
        Board[tr+s][tc+s]=t;
        ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }
}

void ChessPrint()
{
    for(int i=0;i<SIZE;i++)
    {

        for(int j=0;j<SIZE;j++)
        {
            cout<<Board[i][j];
        }
        cout<<endl;
    }
}
int main()
{
    ChessBoard(0,0,1,1,SIZE);
    ChessPrint();

    return 0;
}

 整个算法没有什么太难的地方,就是我一直分不清每个区域的号码



 我将tr和tc搞反了

时间复杂度:



 

猜你喜欢

转载自616306932.iteye.com/blog/2372632