残缺棋盘

残缺棋盘

给出一个棋盘,棋盘大小是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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值