设一个n*n棋盘,n=2^k,用L 型条块覆盖棋盘中除一个指定方格外的所有方格,每个L型条块可恰好覆盖3 个方格。
例:假设n=8,指定左上角不能被覆盖,棋盘的一种覆盖方式如下。
#include <stdio.h>
int a[100][100];
int index=1; //辨别L型的标记
void chessboard(int tx,int ty,int dx,int dy,int s)
{
int t;
if(s==1)
return ;
t=index++;
s=s/2;
if(dx<tx+s && dy<ty+s) //左上格
chessboard(tx,ty,dx,dy,s);
else
{
a[ty+s-1][tx+s-1]=t;
chessboard(tx,ty,tx+s-1,ty+s-1,s);
}
if(dx>tx+s-1 && dy<ty+s) //右上格
chessboard(tx+s,ty,dx,dy,s);
else
{
a[ty+s-1][tx+s]=t;
chessboard(tx+s,ty,tx+s,ty+s-1,s);
}
if(dx<tx+s && dy>ty+s-1) //左下格
chessboard(tx,ty+s,dx,dy,s);
else
{
a[ty+s][tx+s-1]=t;
chessboard(tx,ty+s,tx+s-1,ty+s-1,s);
}
if(dx>tx+s-1 && dy>ty+s-1) //右下格
chessboard(tx+s,ty+s,dx,dy,s);
else
{
a[ty+s][tx+s]=t;
chessboard(tx+s,ty+s,tx+s,ty+s,s);
}
}
int main()
{
int n;
int dx,dy;
int i,j;
printf("请输入棋盘大小(N*N,且N为偶数):");
scanf("%d",&n);
printf("请输入特殊点坐标:");
scanf("%d%d",&dx,&dy);
a[dy-1][dx-1]=0;
chessboard(0,0,dx-1,dy-1,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d\t",a[i][j]);
putchar('\n');
}
return 0;
}