码迷,mamicode.com
首页 > 其他好文 > 详细

【递归】棋盘覆盖

时间:2015-04-11 11:46:28      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:c   算法   棋盘覆盖   棋盘   递归   

问题描述:

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

}
执行完结果。


技术分享

【递归】棋盘覆盖

标签:c   算法   棋盘覆盖   棋盘   递归   

原文地址:http://blog.csdn.net/a781558066/article/details/44993847

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!