解説
概要
この問題は、以下の 3 つのステップ を順に判定することで、 で解くことができます。
- 偶奇性のチェック
- 0-1 BFSによる最小またぎ回数の計算
- 往復の判定
1. 偶奇性の考察
高橋くんが「毛の色をまたぐ移動」を 回行うたびに、現在地にある毛の色は必ず または と反転します。一方、同じ色の毛へ移動しても色は変わりません。
このことから、色をまたぐ移動の回数と、毛の色の関係には以下の性質があります。
- 移動回数が 偶数 回のとき:現在地の毛の色は、始点と同じ色
- 移動回数が 奇数 回のとき:現在地の毛の色は、始点と異なる色
したがって、始点 の毛の色を 、終点 の毛の色を とすると、
- のとき: は 偶数 でなければならない
- のとき: は 奇数 でなければならない
この偶奇が一致していない場合は、どのように移動しても目的地にちょうど 回で到達することは不可能なため、即座に No と判定できます。
2. 0-1 BFSによる最小またぎ回数の計算
目的地 に到達するために、「毛の色をまたぐ移動」を最低何回行う必要があるか を考えます。
これは、グリッド上の移動コストを以下のように定義することで、重み付きグラフの最短経路問題に言い換えることができます。
- 同じ色の毛への移動:コスト
- 異なる色の毛への移動:コスト
移動コストが と のみであるため、0-1 BFS を用いることで、始点 からすべてのマスへの最小コストを で求めることができます。 0-1BFSについては、以下の解説記事を参照してください。
こうして求めた への最小コスト(最小またぎ回数)を とします。
もし であれば、どのようなルートを通っても 回以内で到達できないため No となります。
3. 余った回数の処理
パリティが一致しており、 である場合、差分である は必ず 以上の偶数()になります。
この余った回数は、異なる色の毛が隣接している場所を 往復するたびに 回ずつ消費 することができます。
盤面に色 と色 が両方存在する場合
のグリッドは連結であるため、盤面に色 と色 が両方存在すれば、必ずどこかに「色が異なる隣接した つの毛」が存在します。
その場所を行き来することで回数を ずつ増やせるため、必ずちょうど 回に合わせることができ、判定は Yes となります。
盤面の毛の色がすべて同じ場合
盤面の毛がすべて 、またはすべて の場合、グリッド内に異なる色の隣接が存在しません。 この場合、一度も色を跨ぐことができないため、
- のときは移動可能なので
Yes - のときは回数を稼ぐことができず
Noとなります。
計算量
- 0-1 BFS による最短経路探索:
- 盤面の単色チェックおよびパリティ判定:
全体の計算量は であり、制約 に対して十分高速に動作します。
解答例 (C++23)
ユーザー解説
ユーザー解説を書くユーザー解説はまだありません。