#include <iostream> 
#include <stdio.h> 
#define Board_size 4//该棋盘矩阵的维度 
using namespace std; 
int Board[Board_size][Board_size];//声明该棋盘矩阵 
void ChessBoard(int tr,int tc,int dr,int dc,int size) 
//tr,tc为最左上角的坐标,dr,dc为特殊方块所在的坐标,size为该棋盘的规模 
{ 
if(size == 1) 
return; 
static int tile=1;//定义L型骨牌号的初始使用标号 
int t = tile++;//L型骨牌号 
int 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][tc+s-1]=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-1][tc+s]=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); 
} 
} 
int main(){ 
Board[2][2] = 0;//初始状态下特殊方格坐标为Board[0][0] 
ChessBoard(0,0,2,2,Board_size);//Board_size 
for(int i=0;i<Board_size;i++){//输出骨牌覆盖后的棋盘矩阵 
for(int j=0;j<Board_size;j++) 
cout<<" "<<Board[i][j]; 
cout<<endl; 
} 
return 0; 
}
 相关文章
                            相关文章