棋盘覆盖

棋盘覆盖

题目:在一个2^k*2^k棋盘当中,有一个特殊方格,人们利用L形状的骨牌去覆盖

1.      棋盘覆盖的原理十分的简单:讲现有的磁盘分成2*2块

2.      特殊小方块可以落在该棋盘的任意一个区域内,然后通过在2*2的分界线上将其他的3个棋盘也覆盖一个,利用递归实现

3.      递归的出口在当棋盘的大小变成1*1时,就可以直接退出了

#include<stdlib.h>
#include<stdio.h>
#define CHESSLENGTH 8 //棋盘大小
void chess_Board(int chessBoard[][CHESSLENGTH],int dr,int dt,int pr,int pt,int size);
void printArray(int chessBoard[][CHESSLENGTH]);
void main()
{
	int chessBoard[CHESSLENGTH][CHESSLENGTH] = { 0 };
	chess_Board(chessBoard,0,0,0,0,CHESSLENGTH);
	printArray(chessBoard);

	system("pause");
}

 int title = 1;//覆盖所用的骨牌
//棋盘作为参数传入
//dr 和 dt 是 当前小块的0点zuobiao
//pr 和 pt 是 当前覆盖了的小块
 //size时指当前棋盘的大小
void chess_Board(int chessBoard[][CHESSLENGTH],int dr,int dt,int pr,int pt,int size)
{
	if(size == 1)  return ;//当规模为一时,不需要做任何的改变了
	
	int t = title ++;
	int tsize = size / 2;//每一次棋盘大小变成原来的1/4 

	//棋盘分为四大区域
	//最先处理了特殊方块位于左上方的
	if (pr < dr + tsize && pt < dt + tsize)
	{
		//左上方的
		chess_Board(chessBoard,dr,dt,pr,pt,tsize);
	}
	else
	{
		//左上方的
		chessBoard[dr + tsize-1][dt + tsize -1] = t;
		chess_Board(chessBoard,dr,dt,dr + tsize -1,dt+tsize-1,tsize);
	}
	//特殊方块位于右上方
	if (pr < dr + tsize && pt >= dt + tsize)
	{
		//右上方
		chess_Board(chessBoard,dr,dt + size,pr,pt,tsize);
	}
	else
	{
		//右上方
		chessBoard[dr + tsize-1][dt + tsize ] = t;
		chess_Board(chessBoard,dr,dt+tsize,dr + tsize -1,dt + tsize ,tsize);
	}

	//特殊方块位于左下方

	if (pr >= dr + tsize && pt < dt + tsize)
	{
		//左下方
		chess_Board(chessBoard,dr+tsize,dt,pr,pt,tsize);
	} 
	else
	{
		//左下方
		chessBoard[dr + tsize ][dt + tsize -1] = t;
		chess_Board(chessBoard,dr+ tsize,dt,dr + tsize ,dt + tsize -1,tsize);
	}


	//特殊方块位于右下方

	if (pr >= dr + tsize && pt >= dt + tsize)
	{
		//右下方
		chess_Board(chessBoard,dr + tsize,dt+tsize,pr,pt,tsize);
	}
	else
	{
		//右下方
		chessBoard[dr + tsize ][dt + tsize] = t;
		chess_Board(chessBoard,dr+tsize,dt+tsize,dr+tsize,dt+tsize,tsize);
	}



}

void printArray(int chessBoard[][CHESSLENGTH])
{
	for(int i = 0;i< CHESSLENGTH;i++)
	{
		for (int j = 0;j< CHESSLENGTH;j++)
		{
			printf("%d\t",chessBoard[i][j]);
		}
		printf("\n");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值