棋盘覆盖

算法设计———棋盘覆盖(分治法)

先附上两张运行效果图:

1、

效果图1

2、

效果图2

#include<iostream>
#include<color.h>//附加的包,用于涂色
using namespace std;
#define N 1024
int a[N][N];

void cheesBoard(int sr, int sc, int dr, int dc, int size)
{
    if(size == 1)
        return;
    int s, t;
    s = size / 2;
    if(dr<sr+s && dc<sc+s)//左上
        t = 1;
    else if(dr<sr+s && dc>=sc+s)//右上
        t = 2;
    else if(dr>=sr+s && dc<sc+s)//左下
        t = 3;
    else    
        t = 4;

    if(dr<sr+s && dc<sc+s)//左上
        cheesBoard(sr, sc, dr, dc, s);
    else{
        a[sr+s-1][sc+s-1] = t;
        cheesBoard(sr, sc, sr+s-1, sc+s-1, s);
    }
    if(dr<sr+s && dc>=sc+s)//右上
        cheesBoard(sr, sc+s, dr, dc, s);
    else{
        a[sr+s-1][sc+s] = t;
        cheesBoard(sr, sc+s, sr+s-1, sc+s, s);
    }
    if(dr>=sr+s && dc<sc+s)//左下
        cheesBoard(sr+s, sc, dr, dc, s);
    else{
        a[sr+s][sc+s-1] = t;
        cheesBoard(sr+s, sc, sr+s, sc+s-1, s);
    }
    if(dr>=sr+s && dc>=sc+s)//右下
        cheesBoard(sr+s, sc+s, dr, dc, s);
    else{
        a[sr+s][sc+s] = t;
        cheesBoard(sr+s, sc+s, sr+s, sc+s, s);
    }
}
void print(int k)
{
    int i, j;
    for(i = 0; i < k; ++i){
        for(j = 0; j < k; ++j){
            if(a[i][j] == 1){
                BLACK_RED;        //printf("%-2d ", a[i][j]);
            }else if(a[i][j] == 2){
                BLACK_GREEN;    //printf("%-2d ", a[i][j]);
            }else if(a[i][j] == 3){
                BLACK_BLUE;        //printf("%-2d ", a[i][j]);
            }else if(a[i][j] == 4){
                BLACK_YELLOW;    //printf("%-2d ", a[i][j]);
            }else{
                BLACK_WHITE;    //printf("%-2d ", a[i][j]);
            }
            printf("█");
        }
        cout<<"\n";
    }
}
void init()
{
    BLACK_RED;
    printf("  █ ");
    BLACK_GREEN;
    printf("█   ");
    BLACK_BLUE;
    printf("██ ");
    BLACK_YELLOW;
    printf("██\n");
    BLACK_RED;
    printf("██ ");
    BLACK_GREEN;
    printf("██   ");
    BLACK_BLUE;
    printf("█ ");
    BLACK_YELLOW;
    printf("█\n");
}

int main(void)
{
    int k, dr, dc;
    init();
    while(1){
        BLACK_WHITE;
        cout<<"请输入棋盘边长k:\n";
        cin>>k;
        while(k/2%2 != 0 || k%2 != 0){//这里没做充分判断
            cout<<"你输入k不是2的次方,请重新输入:\n";
            cin>>k;
        }
        cout<<"请输入特殊方块的行位置(1~"<<k<<"):\n";
        cin>>dr;
        cout<<"请输入特殊方块的列位置(1~"<<k<<"):\n";
        cin>>dc;
        while(dr < 1 ||  dr > k){
            cout<<"你输入位置超出范围,请重新输入:\n";
            cin>>dr;
        }
        while(dc < 1 || dc > k){
            cout<<"你输入位置超出范围,请重新输入:\n";
            cin>>dc;
        }
        cheesBoard(0, 0, dr-1, dc-1, k);
        a[dr-1][dc-1] = 0;
        print(k);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值