问题描述:
在一个2^k*2^k 的方格组成的棋盘中,有一个方格与其他方格不同,称为特殊方格。
现在邀请4中不同的L型骨牌 覆盖给定的棋盘除特殊方格外的所有方格。
例如:这是一个K=2时的棋盘,特殊点坐标为(0,1)。
四中L型骨牌如图:
程序代码:
#include <STDIO.H>
#define KEY 8 //棋盘的阶数
int ar[KEY][KEY]={0}; //二维数组保存的棋盘,初始值为全0
int tile=1; //标志
void chessBoard(int tr,int tc,int dr,int dc,int size)
{
int s=size/2; //分割棋盘
int flag;
if(size==1) return ;
flag=++tile;
// 如果特殊点在左上角
if(dr<tr+s && dc<tc+s)
chessBoard(tr,tc,dr,dc,s); //在的话,递归
else
{
ar[tr+s-1][tc+s-1]=flag; //不在的话,把左上角棋盘的右下角赋为标志位。。。下面三个类似
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
{
ar[tr+s-1][tc+s]=flag;
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
{
ar[tr+s][tc+s-1]=flag;
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
{
ar[tr+s][tc+s]=flag;
chessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
void init(int x,int y) //初始化一个点为特殊点
{
ar[x][y]=1;
}
int main()
{
int i,j;
i=4;
j=5;
init(i,j);
chessBoard(0,0,i,j,8);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%2d ",ar[i][j]);
puts("");
}
}
执行完结果。