パスをたどればいい
const int H = 50 + 1;
const int W = 50 + 1;
pair<int, int> path[H][W];
class MazeWanderingEasy {
public:
int decisions(vector <string> maze)
{
const int h = maze.size();
const int w = maze[0].size();
pair<int, int> start, goal;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
if (maze[i][j] == 'M') start = make_pair(i, j);
if (maze[i][j] == '*') goal = make_pair(i, j);
}
}
fill(&path[0][0], &path[H][0], make_pair(-1, -1));
bool vis[H][W];
fill(&vis[0][0], &vis[H][0], false);
vis[start.first][start.second] = true;
const int di[] = {0, 0, -1, +1};
const int dj[] = {-1, +1, 0, 0};
queue< pair<int, int> > q;
for (q.push(start); q.size() && !vis[goal.first][goal.second]; q.pop()) {
pair<int, int> curr = q.front();
for (int d = 0; d < 4; ++d) {
int ni = curr.first + di[d];
int nj = curr.second + dj[d];
if (ni < 0 || nj < 0) continue;
if (h <= ni || w <= nj) continue;
if (vis[ni][nj]) continue;
if (maze[ni][nj] == 'X') continue;
vis[ni][nj] = true;
path[ni][nj] = curr;
q.push(make_pair(ni, nj));
}
}
int ret = 0;
pair<int, int> p = goal;
while (true) {
if (p != goal) {
ret += (bool)(count(&path[0][0], &path[H][0], p) - 1);
}
if (p == start) break;
p = path[p.first][p.second];
}
return ret;
}
};