棋盘覆盖
题目:在一个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");
}
}