棋盘覆盖问题

其实这个题目拿到手的时候我是懵的,我不知道怎么写,后来看了别人的代码,明白了思想再去写的,其实他就是一个分治的思想,把棋盘分成四个部分,依次递归,四个部分的每个部分都要判断那个特殊点是不是在这个部分内,然后依次递归。

题目如下:

 有一个2^k*2^k的正方形棋盘,在其内部有一个特殊方格标记为0,现在要用L形状的骨牌来覆盖除了特殊方格外的全部期盼,骨牌可以任意旋转但不能重叠。

输入有两行,第一行是棋盘的大小,第二行是特殊值的位置。

代码如下:

#include<stdio.h>

int a[100][100];

int jishu=0;

void chazhao(int hang,int lie,int x,int y,int k)

{

   

    if(k==1){//一定要有的条件

        return;

    }

    int l,n;

    l=k/2;

    jishu++;

    n=jishu;

    if(hang+l>x&&lie+l>y)//左上

    chazhao(hang,lie,x,y,l);

    else

    {

        a[hang+l-1][lie+l-1]=n;

        chazhao(hang,lie,hang+l-1,lie+l-1,l);

    }

    if(hang+l>x&&lie+l<=y)//右上

    chazhao(hang,lie+l,x,y,l);

    else

    {

        a[hang+l-1][lie+l]=n;

        chazhao(hang,lie+l,hang+l-1,lie+l,l);

    }

    if(hang+l<=x&&lie+l>y)//左下

    chazhao(hang+l,lie,x,y,l);

    else

    {

        a[hang+l][lie+l-1]=n;

        chazhao(hang+l,lie,hang+l,lie+l-1,l);

    }

   

    if(hang+l<=x&&lie+l<=y)//右下

    chazhao(hang+l,lie+l,x,y,l);

    else

    {

       a[hang+l][lie+l]=n;

       chazhao(hang+l,lie+l,hang+1,lie+l,l);

    }

}

void main()

{

    int k,x,y;

    scanf("%d%d%d",&k,&x,&y);

    chazhao(0,0,x,y,k);

    for(int i=0;i<k;i++)

        {

            for(int j=0;j<k;j++)

            printf("%d ",a[i][j]);

            printf("\n");

        }

}

注意左上右上左后右后的顺序不能反,如果反了话就要改条件。

  • 0
    点赞
  • 0
    收藏 更改收藏夹
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郭同学1564

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值