分治法:棋盘覆盖问题

若棋盘规格是1*1,则不用填充;
若棋盘规格大于1*1,则将棋盘分割成四个子棋盘。判断特殊点在哪一个子棋盘中,进入该棋盘继续覆盖,而对其他子棋盘,设置边界点为新特殊点(填充这3个边界点即是填充了一个L型骨牌),并对各个子棋盘继续覆盖。

Code:
  1. #include<iostream>   
  2. using namespace std;   
  3.     
  4. #define N 10        //  最大棋盘size   
  5.     
  6. int Board[N][N];        //      棋盘矩阵   
  7. int tile = 1;      // 当前骨牌编号   
  8.     
  9. /**************************************************************  
  10. * 棋盘覆盖分治算法  
  11. *  
  12. * 输入:棋盘起始点坐标tr,tc,特殊点坐标dr,dc,棋盘规格小size  
  13. * 输出:覆盖好的棋盘矩阵Board[][]  
  14. **************************************************************/  
  15. void ChessBoard(int tr, int tc, int dr, int dc, int size){   
  16.         if(size==1)return;            //    若棋盘大小为1则返回   
  17.         int t = tile++,   //       当前要填充的骨牌号   
  18.                 s = size/2;               //   分割的棋盘规格   
  19.     
  20.         //      若特殊点在左上角棋盘   
  21.         if(dr<tr+s&&dc<tc+s){   
  22.                 //      特殊方格在此棋盘中   
  23.                 ChessBoard(tr,tc,dr,dc,s);   
  24.         }else{   
  25.                 //      将该棋盘的右下角点填充骨牌,使其成为新特殊点   
  26.                 Board[tr+s-1][tc+s-1] = t;   
  27.                 //      在该棋盘中继续覆盖   
  28.                 ChessBoard(tr, tc, tr+s-1, tc+s-1, s);   
  29.         }   
  30.     
  31.         //      若特殊点在右上角棋盘   
  32.         if(dr<tr+s&&dc>=tc+s){   
  33.                 ChessBoard(tr, tc+s, dr, dc, s);   
  34.         }else{   
  35.                 Board[tr+s-1][tc+s] = t;   
  36.                 ChessBoard(tr, tc+s, tr+s-1, tc+s, s);   
  37.         }   
  38.     
  39.         //      若特殊点在左下角棋盘   
  40.         if(dr>=tr+s&&dc<tc+s){   
  41.                 ChessBoard(tr+s, tc, dr, dc, s);   
  42.         }else{   
  43.                 Board[tr+s][tc+s-1]= t;   
  44.                 ChessBoard(tr+s, tc, tr+s, tc+s-1, s);   
  45.         }   
  46.     
  47.         //      若特殊点在右下角棋盘   
  48.         if(dr>=tr+s&&dc>=tc+s){   
  49.                 ChessBoard(tr+s, tc+s, dr, dc, s);   
  50.         }else{   
  51.                 Board[tr+s][tc+s] = t;   
  52.                 ChessBoard(tr+s, tc+s, tr+s, tc+s, s);   
  53.         }   
  54. }   
  55.     
  56. int main(){   
  57.         int n,i,j,x,y;   
  58.     
  59.         //      输入棋盘规格和特殊点坐标x,y   
  60.         cin>>n>>x>>y;   
  61.     
  62.         //      初始化棋盘矩阵   
  63.         memset(Board,0,sizeof(Board));   
  64.           
  65.         //      覆盖棋盘   
  66.         ChessBoard(0,0,x,y,n);   
  67.     
  68.         //      输出覆盖后的棋盘矩阵   
  69.         for(i=0;i<n;i++){   
  70.                 for(j=0;j<n;j++){   
  71.                         printf("%5d",Board[i][j]);   
  72.                 }   
  73.                 cout<<endl;   
  74.         }   
  75.     
  76.         return 0;   
  77. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值