算法设计———棋盘覆盖(分治法)
先附上两张运行效果图:
1、
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;
}