【递归】棋盘覆盖

问题描述:

在一个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("");
	}
	

}
执行完结果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值