棋盘覆盖问题,讲的是在一个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);}
}