# ARC117-C Routing 1055diff https://atcoder.jp/contests/arc177/tasks/arc177_c ## 解法 条件1を達成するために変更すべきマスは青いマスのみである。 また、どの青マスを紫マスに変えた所で、条件2にとって不利になることはない 条件2を達成するために変更すべきマスは赤いマスのみである。 また、どの赤マスを紫マスに変えた所で、条件1にとって不利になることはない 以上より「条件1を達成するために紫マスに変更する青マスの最小個数は?」と「条件2を達成するために紫マスに変更する赤マスの最小個数は?」を独立に解けばよく、どちらとも01BFSでできる。 ## 実装 ```cpp= #include <bits/stdc++.h> const int dx[4]{ 0, 1, 0, -1 }, dy[4]{ 1, 0, -1, 0 }; int main() { std::cin.tie(nullptr)->sync_with_stdio(false); int N; std::cin >> N; std::vector<std::string> S(N); for (auto& s : S) std::cin >> s; auto in{[&](int x, int y) -> bool { return 0 <= x and x < N and 0 <= y and y < N; }}; auto bfs{[&](int sx, int sy, int gx, int gy, char ok) -> int { const int INF{(int)1e9}; std::vector dist(N, std::vector<int>(N, INF)); dist[sx][sy] = 0; std::deque<std::pair<int, int>> deq; deq.push_back(std::pair{sx, sy}); while (deq.size()) { auto [x, y]{deq.front()}; deq.pop_front(); for (int d{} ; d < 4 ; d++) { int nx{x + dx[d]}, ny{y + dy[d]}; if (!in(nx, ny)) continue; int w{S[nx][ny] == ok ? 0 : 1}; if (dist[nx][ny] > dist[x][y] + w) { dist[nx][ny] = dist[x][y] + w; if (w) deq.push_back(std::pair{ nx, ny }); else deq.push_front(std::pair{ nx, ny }); } } } return dist[gx][gy]; }}; std::cout << bfs(0, 0, N - 1, N - 1, 'R') + bfs(0, N - 1, N - 1, 0, 'B') << '\n'; } ``` [提出](https://atcoder.jp/contests/arc177/submissions/58160815) ## 感想 昔解説を開いた記憶があって、本質パートを記憶したままだった....