棋盘覆盖

来源:互联网 发布:搜索算法的复杂度 编辑:程序博客网 时间:2024/06/10 11:24

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

先附上两张运行效果图:

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;
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 12306被别人注册了怎么办 铁路1236注册名忘记了怎么办 12306手机被别人注册了怎么办 12306注册手机不用了怎么办 到站后火车票掉了怎么办 在手机上买了票怎么办 智行火车票抢不到票怎么办 高铁买票票丢了怎么办 异地恋房费太贵怎么办 高铁票车上丢了怎么办 取了高铁票丢了怎么办 高铁买了学生票没带学生证怎么办 买的学生票超过区间怎么办 买了超过区间的学生票怎么办 火车票大于学生票购买区间怎么办 买了学生票学生证丢了怎么办 取票学生证没带怎么办 学生卡的失磁怎么办 学生证没有充磁买不了学生票怎么办 买学生票不在优惠区间怎么办 火车票学生优惠次数用完怎么办 学生乘火车优惠磁卡丢了怎么办 磁卡锁的卡丢了怎么办 电梯磁卡扣丢了怎么办 买火车票手机号填错了怎么办 买火车票乘客身份核验失败怎么办 火车票不在一个车厢怎么办站票 坐火车丢东西了怎么办 g2坐过站了怎么办 坐火车买近了怎么办 打印的纸质火车票丢失怎么办 格力空调没保修单怎么办 格力空调不兑现保修怎么办 哈空调如果退市怎么办 空调保修单丢了怎么办 海尔空调发票丢了怎么办 格力空调发票丢了怎么办 联程航班第一程延误怎么办 飞机经停10小时怎么办 去车站买票没带身份证怎么办 转机航班第一班延误了怎么办