您的位置:首页 > 其它

残缺棋盘

2016-08-02 13:49 253 查看
残缺棋盘

给出一个棋盘,棋盘大小是2^k,k为正数,然后给出一个点是坏点。

要求用硬纸板将棋盘填充,硬纸板的形状为单位长度是2的正方形,扣去任意一个单位。即存在四种硬纸板。

填充要求,硬纸板不能覆盖坏点,也不能重复覆盖。

解题思路

找到坏点所在象限,然后用硬纸板在棋盘中心覆盖,使其余的三个象限都有“坏点”(即将硬纸板看做坏点),这样四个象限所处理的问题就相同,也就是递归。

递归的出口就是当单位面积为四的时候,这时候必然有一个坏点,这时候将其余的用硬纸板填充即可。

传递参数是时候只需传递当前棋盘的左上角坐标,坏点坐标,当前棋盘的边长即可。

代码

#include<stdio.h>
int  tile=1;
int  Board[512][512];

void TileBoard(int tr,int tc,int dr,int dc,int size)
{    //覆盖残缺棋盘
if(size==1) return;
int t=tile++,    //所使用的三格板的数目
s=size/2;//象限大小
//覆盖左上象限
if(dr
TileBoard(tr,tc,dr,dc,s);
else
{    //本象限中没有残缺方格, 把三格板t放在右下角
Board[tr+s-1][tc+s-1]=t;
//覆盖其余部分
TileBoard(tr,tc,tr+s-1,tc+s-1,s);
}
//覆盖右上象限
if(dr=tc+s)    //残缺方格位于本象限
TileBoard(tr,tc+s,dr,dc,s);
else
{    //本象限中没有残缺方格, 把三格板t放在左下角
Board[tr+s-1][tc+s]=t;
//覆盖其余部分
TileBoard(tr,tc+s,tr+s-1,tc+s,s);
}
//覆盖左下象限
if(dr>=tr+s&&dc
TileBoard(tr+s,tc,dr,dc,s);
else
{    //把三格板t放在右上角
Board[tr+s][tc+s-1]=t;
//覆盖其余部分
TileBoard(tr+s,tc,tr+s,tc+s-1,s);
}
//覆盖右下象限
if(dr>=tr+s&&dc>=tc+s)    //残缺方格位于本象限
TileBoard(tr+s,tc+s,dr,dc,s);
else
{    //把三格板t放在左上角
Board[tr+s][tc+s]=t;
//覆盖其余部分
TileBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
void OutputBoard(int size)
{
int i;
int j;
for(i=0;i
{
for(j=0;j
printf( "]", Board[i][j] );
printf( "\n" );
}
}
void main()
{
int k;
printf("INPUT THE SIZE OF THE CHECKBOARD:");
scanf("%d",&k);
printf("INPUT THE X:");
int x;
scanf("%d",&x);
printf("INPUT THE Y:");
int y;
scanf("%d",&y);
TileBoard( 0, 0, x, y, k);
OutputBoard( k );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: