算法经典问题
棋盘覆盖问题
- 问题描述:
- 自我理解:对于仅存在一个奇异点,想到奇异点的填充肯定可以通过一个“L”形状构成一个正方形。我们可以通过不断缩小方格尺寸(我们的目标是每一个缩小尺寸到4✖4的小方格中都有一个“认为规定的奇异点,这些相连奇异点同时也能构成一个"L“形状,但也可以想成是我们之前通过"L"模型划分的”人为奇异点“),因为之可能存在有限种情况。不好分析L的摆放模式,但是我们可以构造”奇异点“。全部分清奇异点存在的种类,然后再通过”L“形去填充这些空白的”格子“。
- 受到启发于这个宝藏博客”棋盘覆盖问题的图形解答“
#include <stdio.h>
#define MaxValue 100
void chessboard(int tx,int ty,int x,int y,ing size)
{
int s =gupai++;
int mid = size/2;
if(size==1)
return;
if(tx<x+mid && ty<y+mid)
{
chessboard(tx,ty,x,y,mid);
}
else
{
QiPan[x+mid-1][y+mid-1] = s;
chessboard(tx+mid-1,ty+mid-1,x,y,mid);
}
if((tx<x+mid) && (ty>=y+mid))
{
chessboard(tx,ty,x,y+mid,mid);
}
else
{
QiPan[x+mid-1][y+mid] = s;
chessboard(x+mid-1,y+mid,x,y+mid,mid);
}
if(tx>=x+mid&&ty<y+mid)
{
chessboard(tx,ty,x+mid,y,mid);
}
else
{
QiPan[x+mid][y+mid-1] = s;
chessboard(x+mid,y+mid-1,x+mid,y,mid);
}
if((tx>=x+mid)&&(ty>=y+mid))
{
chessboard(tx,ty,x+mid,y+mid,mid);
}
else
{
QiPan[x+mid][y+mid] = s;
chessboard(x+mid,x+mid,x+mid,y+mid,mid);
}
int main ()
{
int tx,ty,x=0,y=0,size;
int QiPan[MaxValue][MaxValue];
int gupai =0;
scanf("%d %d %d",&tx,&ty,&size);
chessboard(tx,ty,x,y,size);
}