棋盘覆盖问题

Source Code:

 

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

 

const int N=1024;

 

int board[N][N],count;

 

void cover(int sx,int sy,int cx,int cy,int size,int cx1[],int cy1[])

{

    int midx=sx+size,midy=sy+size;

    if(cx<midx&&cy<midy)

    {

        cx1[0]=cx;cy1[0]=cy;

        cx1[1]=midx-1; cy1[1]=midy;

        cx1[2]=midx; cy1[2]=midy-1;

        cx1[3]=midx; cy1[3]=midy;

        board[cx1[1]][cy1[1]]=count;

        board[cx1[2]][cy1[2]]=count;

        board[cx1[3]][cy1[3]]=count;

    }

    else if(cx<midx&&cy>=midy)

    {

        cx1[0]=midx-1; cy1[0]=midy-1;

        cx1[1]=cx; cy1[1]=cy;

        cx1[2]=midx; cy1[2]=midy-1;

        cx1[3]=midx; cy1[3]=midy;

        board[cx1[0]][cy1[0]]=count;

        board[cx1[2]][cy1[2]]=count;

        board[cx1[3]][cy1[3]]=count;

    }

    else if(cx>=midx&&cy<midy)

    {

        cx1[0]=midx-1; cy1[0]=midy-1;

        cx1[1]=midx-1; cy1[1]=midy;

        cx1[2]=cx; cy1[2]=cy;

        cx1[3]=midx; cy1[3]=midy;

        board[cx1[0]][cy1[0]]=count;

        board[cx1[1]][cy1[1]]=count;

        board[cx1[3]][cy1[3]]=count;

    }

    else

    {

        cx1[0]=midx-1; cy1[0]=midy-1;

        cx1[1]=midx-1; cy1[1]=midy;

        cx1[2]=midx; cy1[2]=midy-1;

        cx1[3]=cx; cy1[3]=cy;

        board[cx1[0]][cy1[0]]=count;

        board[cx1[1]][cy1[1]]=count;

        board[cx1[2]][cy1[2]]=count;

    }

    count++;

}

 

void TileBoard(int sx,int sy,int cx,int cy,int size)

{//(sx,sy) represents start point, (cx,cy) is covered point

    if(size==1)

        return;

    int cx1[4],cy1[4];

    size/=2;

    cover(sx,sy,cx,cy,size,cx1,cy1);

    TileBoard(sx,sy,cx1[0],cy1[0],size);

    TileBoard(sx,sy+size,cx1[1],cy1[1],size);

    TileBoard(sx+size,sy,cx1[2],cy1[2],size);

    TileBoard(sx+size,sy+size,cx1[3],cy1[3],size);

}

 

void print(int n)

{

    int i,j;

    for(i=0;i<n;i++)

    {

        for(j=0;j<n-1;j++)

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

        printf("%2d/n",board[i][j]);

    }

    printf("/n");

}

 

int main()

{

    printf("为简化代码,我假定你的输入是正确的!输入以000结束。/n");

    while(1)

    {

        printf("请输入起点坐标:");

        int x,y;

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

        int size;

        printf("请输入棋盘大小:");

        scanf("%d",&size);

        if(x==0&&y==0&&size==0)

            break;

        memset(board,0,sizeof(board));

        board[x][y]=-1;

        count=0;

        TileBoard(0,0,x,y,size);

        printf("Answer:/n");

        print(size);

    }

    return 0;

}

 

测试:

 

为简化代码,我假定你的输入是正确的!输入以000结束。

请输入起点坐标:0 0

请输入棋盘大小:2

Answer:

-1  0

 0  0

 

请输入起点坐标:3 3

请输入棋盘大小:4

Answer:

 1  1  2  2

 1  0  0  2

 3  0  4  4

 3  3  4 -1

 

请输入起点坐标:0 0

请输入棋盘大小:0

 

Process returned 0 (0x0)   execution time : 26.531 s

Press any key to continue.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值