残缺棋盘

棋手楚继光和张琪曼一动不动地在期盼前已经沉默地坐了五个小时。
他们全神贯注地盯着每粒棋子。
突然,楚继光说:“原则上我是反对在下棋时说话的,但是我现在不得不开口问:现在究竟该谁下一步棋了?”
张琪曼说:“谁先走都不重要了,现在的问题是:谁把这个棋盘上的格子损坏了?”
如下图所示,有一正方形棋盘,其边长为2k(1<k<10),其中有一格损坏。现在想用下图中间所示形状的硬纸板将没有坏的所有格子盖起来。而硬纸板不得放入坏格中和棋盘外面。编程输出一种覆盖方案,将共用一块硬纸板的三个格子用相同的数字表示。

上图所示是k=2的情形,且输出结果不一定和图示方案一致,符合题目要求即可,输出时只需输出数字方阵而不必画出格子线。

输入

三个整数,即k和坏格子的y坐标、x坐标(注意坏格子的坐标输入顺序)

输出

数字方阵,其中坏坐标以数字7表示(行尾有一个空格)

样例输入

2 1 1

样例输出

7 4 2 2 
4 4 4 2 
3 4 4 4 
3 3 4 4 
先从整体上找到方位偏移,在图形中间加对应模板,之后继续对每一片区域四分,再对应去找相对的模板去覆盖,有递归思想

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cstdio>

#include<cmath>

#include <climits>

#include<queue>

#include<vector>

#include <string.h>

#include <math.h>

#include<map>

#include<string.h>

#define ll long long

using namespace std;

int pic[1200][1200];

void cover(int x0,int y0,int x,int y,int t)

{

    int k=t;

    if(t!=0)

    {

        if((x>=k+x0)&&(y>=k+y0))//you  xia

        {

            pic[k+x0-1][k+y0]=1;

            pic[k+x0-1][k+y0-1]=1;

            pic[k+x0][k+y0-1]=1;

            cover(x0,y0,k+x0-1,k+y0-1,k/2);

            cover(x0,y0+k,x0+k-1,y0+k,k/2);

            cover(x0+k,y0,x0+k,k+y0-1,k/2);

            cover(k+x0,k+y0,x,y,k/2);

        }

        else if((x>=k+x0)&&(y<k+y0))//zuo  xia

        {

            pic[k+x0-1][k+y0-1]=2;

            pic[k+x0-1][k+y0]=2;

            pic[k+x0][k+y0]=2;

            cover(x0,y0,k+x0-1,k+y0-1,k/2);

            cover(x0,k+y0,k+x0-1,k+y0,k/2);

            cover(x0+k,y0+k,x0+k,y0+k,k/2);

            cover(k+x0,y0,x,y,k/2);

        }

        else if((x<k+x0)&&(y>=k+y0))

        {

            pic[k+x0-1][k+y0-1]=3;

            pic[k+x0][k+y0-1]=3;

            pic[k+x0][k+y0]=3;

            cover(x0,y0,k+x0-1,k+y0-1,k/2);

            cover(k+x0,y0,k+x0,k+y0-1,k/2);

            cover(k+x0,k+y0,k+x0,k+y0,k/2);

            cover(x0,k+y0,x,y,k/2);

        }

        else

        {

            pic[k+x0-1][k+y0]=4;

            pic[k+x0][k+y0-1]=4;

            pic[k+x0][k+y0]=4;

            cover(x0,y0,x,y,k/2);

            cover(k+x0,y0,k+x0,k+y0-1,k/2);

            cover(x0,k+y0,k+x0-1,k+y0,k/2);

            cover(k+x0,k+y0,k+x0,k+y0,k/2);

        }

    }

}

int main()

{

    //freopen("in.txt","r",stdin);

    int k,x,y,cnt=1;

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

    pic[x][y]=7;

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

    {

        cnt*=2;

    }

    cover(1,1,x,y,cnt);

    for(int i=1;i<=cnt;i++)

    {

        for(int j=1;j<=cnt;j++)

        {

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

        }

        printf("\n");

    }

    return 0;

}

猜你喜欢

转载自blog.csdn.net/weixin_41370251/article/details/81070137