分治策略——棋盘覆盖问题

问题

  • 用分治法设计一个求解棋盘覆盖问题的算法。

代码

#include <stdio.h>
#include <stdlib.h>

int chess[10][10],number;
void chessboard(int r,int c,int x,int y,int size)
{
    int s,t,tr,tc;//定义变量
    if(size==1)
        return;
    s=size/2;
    t=++number;
    tr=r+s;
    tc=c+s;
    if(x<tr&&y<tc)//黑方格在棋盘左上角
    {
        chessboard(r,c,x,y,s);
    }
    else//不在左上角
    {
        chess[tr-1][tc-1]=t;//将左上角棋盘的右下角标为黑色方格
        chessboard(r,c,tr-1,tc-1,s);
    }

    if(x<tr&&y>=tc)//黑方格在棋盘右上角
    {
        chessboard(r,tc,x,y,s);
    }
    else//不在右上角
    {
        chess[tr-1][tc]=t;//将右上角棋盘的左下角标为黑色方格
        chessboard(r,tc,tr-1,tc,s);
    }

    if(x>=tr&&y<tc)//黑方格在棋盘左下角
    {
        chessboard(tr,c,x,y,s);
    }
    else//不在左下角
    {
        chess[tr][tc-1]=t;//将左下角棋盘的右上角标为黑色方格
        chessboard(tr,c,tr,tc-1,s);
    }

    if(x>=tr&&y>=tc)//黑方格在棋盘右下角
    {
        chessboard(tr,tc,x,y,s);
    }
    else//不在右下角
    {
        chess[tr][tc]=t;//将右下角棋盘的左上角标为黑色方格
        chessboard(tr,tc,tr,tc,s);
    }
}
int main()
{
    int x,y,size,i,j;//定义变量
    scanf("%d %d %d",&x,&y,&size);//输入棋盘上黑色方格位置(x,y)以及棋盘大小ize
    if(size==0)
        return 0;
    chess[x][y]=number=1;
    chessboard(0,0,x,y,size);
    for(i=0;i<size;i++)//循环输出
    {
        for(j=0;j<size;j++)
        {
            if(j==size-1)
                printf("%d\n",chess[i][j]);
            else
                printf("%d ",chess[i][j]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值