棋盘覆盖问题

棋盘覆盖问题,讲的是在一个2的次方乘以2的次方的一个矩阵中有一个特殊的元素所占据的特殊位置,你如何在除去这个特殊位置上用一个L型(由三个方格组成,判断的时候,仍然要一个个的判断)填满整个棋盘,L其思想是将棋盘分成四个小棋盘,先在正中间判断特殊位置的凹向(其实也就是经过TR,TC,DR,DC的大小来判断),也就是经过这三个中间位置满足TR+S--《》的关系来确定,最后,每一次递归,将在每一个小棋盘中填三个棋格,看起来像L型,并将矩阵的中的相应元素置为相同的元素

 

#include<iostream>
using namespace std;
static int tile=1;
const int Bsize=4;
int board[Bsize][Bsize];
void chessBoard(int tr, int tc, int dr, int dc, int size);//对棋盘覆盖函数进行前视定义
void main()
{int tr=0,tc=0;//进入覆盖函数时的左上角,行号,和列号
const int dr=3,dc=3;//假设特殊方格在
board[dr][dc]=NULL;
chessBoard(tr,tc,dr,dc,Bsize);

for(int i=0;i<=Bsize-1;i++)
for (int j=0;j<=Bsize-1;j++)
{cout<<board[i][j]<<"      ";
if(j==Bsize-1)
cout<<endl;}
}


void chessBoard(int tr, int tc, int dr, int dc, int size)
   {
      if (size == 1) return;
      int t = tile++,  // L型骨牌号
        s = size/2;  // 分割棋盘
      // 覆盖左上角子棋盘
      if (dr < tr + s && dc < tc + s)
         // 特殊方格在此棋盘中
         chessBoard(tr, tc, dr, dc, s);
      else {// 此棋盘中无特殊方格
         // 用 t 号L型骨牌覆盖右下角
         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 {// 此棋盘中无特殊方格
         // 用 t 号L型骨牌覆盖左下角
        
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 {// 用 t 号L型骨牌覆盖右上角
         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 {// 用 t 号L型骨牌覆盖左上角
         board[tr + s][tc + s] = t;
         // 覆盖其余方格
         chessBoard(tr+s, tc+s, tr+s, tc+s, s);}
   }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值