やるだけ。シミュレーションする。
const int H = 50 + 2;
const int W = H;
bool vis[H][W];
const int di[] = {0, -1, 0, +1};
const int dj[] = {+1, 0, -1, 0};
bool f(int i, int j, int h, int w, vector<int> M)
{
fill(&vis[0][0], &vis[H - 1][W], false);
int dir = 0;
int ni, nj;
for (int k = 0; k < M.size(); ++k) {
while (true) {
vis[i][j] = true;
ni = i + di[dir];
nj = j + dj[dir];
if (ni < 0 || nj < 0 || h <= ni || w <= nj || vis[ni][nj]) {
break;
} else {
--M[k];
i = ni;
j = nj;
}
}
dir = (dir + 1) % 4;
ni = i + di[dir];
nj = j + dj[dir];
if (ni < 0 || nj < 0 || h <= ni || w <= nj || vis[ni][nj]) {
return M[k] <= 0 && (k + 1) == M.size();
}
if (M[k]) {
return M[k] <= 0 && (k + 1) == M.size();
}
}
return true;
}
class RotatingBot {
public:
int minArea(vector <int> moves)
{
const int inf = 1 << 30;
int mn = inf;
for (int h = 1; h < H; ++h) {
for (int w = 1; w < W; ++w) {
int j = w - moves[0] - 1;
if (j < 0) continue;
for (int i = 0; i < h; ++i) {
if (f(i, j, h, w, moves)) {
mn = min(mn, h * w);
}
}
}
}
return mn == inf ? -1 : mn;
}
};