L型骨牌棋盘覆盖

设一个n*n棋盘,n=2^k,用L 型条块覆盖棋盘中除一个指定方格外的所有方格,每个L型条块可恰好覆盖3 个方格。

例:假设n=8,指定左上角不能被覆盖,棋盘的一种覆盖方式如下。

L型骨牌棋盘覆盖_第1张图片

#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;
}


你可能感兴趣的:(L型骨牌棋盘覆盖)