【算法】分治策略之棋盘覆盖问题

问题 :

在一个{2}^{k}*{2}^{k}个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

 【算法】分治策略之棋盘覆盖问题_第1张图片

策略: 

将棋盘分割成四个大小相等的子棋盘,则特殊方格必位于4个较小子棋盘之一中,其余三个无特殊方格。为了将这3个子棋盘转化为特殊棋盘,可以用一个L

形骨牌覆盖这三个较小棋盘的汇合处,这三个子棋盘被骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将问题转化为四个较小规模的棋盘覆盖问题。递归地分割棋盘,直到简化为1*1的棋盘。

【算法】分治策略之棋盘覆盖问题_第2张图片

 

 

 

代码 : 

#include 
int board[100][100];
int count=0;

void chessBoard(int tr, int tc, int dr, int dc, int size);
/*
tr--当前棋盘左上角的行号
tc--当前棋盘左上角的列号
dr--特殊方格所在的行号
dc--特殊方格所在的列号
size:当前棋盘的:2^k
*/
int main()
{
    int size,i,j,row,col;
    scanf("%d",&size);
    scanf("%d%d",&row,&col);
    chessBoard(0,0,row-1,col-1,size);

    for(i=0;i=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=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);
    }

}

【算法】分治策略之棋盘覆盖问题_第3张图片

 

你可能感兴趣的:(【算法】分治策略之棋盘覆盖问题)