分治算法--棋盘划分

30 篇文章 0 订阅

一个2k×2k 个方格棋盘中,其中一个方格与其他方格颜色不同,则该方格为特殊方格,且称该区域的棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图1的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

算法思想:将棋盘划分成四个子棋盘,对棋盘区域内方格进行判断,若有特殊方格,则覆盖其他三个子棋盘的交界处的三个方格(特殊子棋盘中的除外),然后递归继续对其他三个子棋盘依次划分,直到棋盘大小变成1x1大小

递归公式:T(k) = 4T(k-1)+O(1)    , k>0

param: tr:左上角方格行号;tc:右上角方格列号;   dr:特殊方格行号; dc:特殊方格列号;  size:棋盘大小

void ChessBoard(int tr, int tc, int dr, int dc ,int size){
    if(size == 1){
        return ;
    }
    title ++;
    size = size/2;
    if(dr<tr+s && dc<tc+s){
        ChessBoard(tr,tc,dr,dc,size);
    }else{
        Board[tr+s-1][tc+s-1] = title;
        ChessBorad(tr,tc,tr+s-1,tc+s-1,size);
    }

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

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

    if(dr>tr+s && dc>tc+s){
        ChessBoard(tr,tc,dr,dc,size);
    }else{
        Board[tr+s][tc+s] = title;
        ChessBorad(tr,tc,tr+s,tc+s,size);
    }

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值