塗りつぶす
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; } };