塗りつぶす
const int N = 200 + 10;
int color[N][N];
const int base = N / 2;
bool vis[N][N];
void rec(int i, int j)
{
vis[i][j] = true;
const int di[] = {0, 0, -1, +1};
const int dj[] = {-1, +1, 0, 0};
for (int d = 0; d < 4; ++d) {
int ni = i + di[d];
int nj = j + dj[d];
if (ni < 0 || nj < 0) continue;
if (N <= ni || N <= nj) continue;
if (color[i][j] != color[ni][nj]) continue;
if (vis[ni][nj]) continue;
rec(ni, nj);
}
return ;
}
class HoleCakeCuts {
public:
int cutTheCake(int cLength, int hLength, vector <int> hCuts, vector <int> vCuts)
{
int c = 0;
fill(&color[0][0], &color[N][0], -1);
for (int i = -cLength; i < +cLength; ++i) {
for (int j = -cLength; j < +cLength; ++j) {
color[i + base][j + base] = c;
}
}
++c;
for (int i = -hLength; i < +hLength; ++i) {
for (int j = -hLength; j < +hLength; ++j) {
color[i + base][j + base] = -1;
}
}
hCuts.push_back(+cLength + 1);
hCuts.push_back(-cLength - 1);
vCuts.push_back(+cLength + 1);
vCuts.push_back(-cLength - 1);
sort(hCuts.begin(), hCuts.end());
sort(vCuts.begin(), vCuts.end());
for (int h = 0; h + 1 < hCuts.size(); ++h) {
for (int v = 0; v + 1 < vCuts.size(); ++v) {
bool flg = false;
for (int i = hCuts[h]; i < hCuts[h + 1] ; ++i) {
for (int j = vCuts[v]; j < vCuts[v + 1] ; ++j) {
if (0 <= color[i + base][j + base]) {
color[i + base][j + base] = c;
flg = true;
}
}
}
c += flg;
}
}
fill(&vis[0][0], &vis[N][0], false);
int ret = 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if (0 <= color[i][j] && !vis[i][j]) {
rec(i, j);
++ret;
}
}
}
return ret;
}
};