这个问题的解决思路是分治与递归。
找到黑方格所在的位置,将棋盘等分为四块,将其余三块补为黑色即可。
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 5000;
int map[maxn][maxn];
int k;
int x, y;
int color = 0;
int black = -2;
void div(int lx, int ly, int bx, int by,int len) {
if (len == 2) {
for (int i = lx; i <= lx + 1; i++) {
for (int j = ly; j <= ly + 1; j++) {
if (map[i][j] > -1)
map[i][j] = color;
}
}
color++;
return;
}
int midx = len / 2 + lx - 1;
int midy = len / 2 + ly - 1;
int t = len / 2;
if (bx <= midx && by <= midy) {
map[midx][midy + 1] = map[midx + 1][midy] = map[midx + 1][midy + 1] = black;
div(lx, ly, bx, by, t);
div(lx + t, ly, midx + 1, midy, t);
div(lx, ly + t, midx, midy + 1, t);
div(lx + t, ly + t, midx + 1, midy + 1, t);
black--;
}
else if (bx > midx && by <= midy) {
map[midx][midy + 1] = map[midx][midy] = map[midx + 1][midy + 1] = black;
div(lx, ly, midx, midy, t);
div(lx + t, ly, bx, by, t);
div(lx, ly + t, midx, midy + 1, t);
div(lx + t, ly + t, midx + 1, midy + 1, t);
black--;
}
else if (bx <= midx && by > midy) {
map[midx][midy] = map[midx + 1][midy] = map[midx + 1][midy + 1] = black;
div(lx, ly, midx, midy, t);
div(lx + t, ly, midx + 1, midy, t);
div(lx, ly + t, bx, by, t);
div(lx + t, ly + t, midx + 1, midy + 1, t);
black--;
}
else {
map[midx][midy + 1] = map[midx + 1][midy] = map[midx][midy] = black;
div(lx, ly, midx, midy, t);
div(lx + t, ly, midx + 1, midy, t);
div(lx, ly + t, midx + 1, midy, t);
div(lx + t, ly + t, bx, by, t);
black--;
}
}
int main()
{
cin >> k;
cin >> x >> y;
map[x][y] = -1;
div(1, 1, x, y, pow(2, k));
for (int i = 1; i <= pow(2, k); i++) {
for (int j = 1; j <= pow(2, k); j++) {
cout << map[i][j] << " ";
}
cout << endl;
}
return 0;
}