Processing math: 100%

DEGwer さんの D 論応援コンテスト B問題メモ

B - vs. DEGwer

問題

  • H×W のグリッド上に部屋が並んでいる
    • 上下左右に隣接する部屋の間に扉があり、互いに繋がっている
    • 一番左列の部屋の左側にそれぞれ扉があり、入口となる大部屋 S に繋がっている
    • 一番右列の部屋の右側にそれぞれ扉があり、出口となる大部屋 T に繋がっている
    • はじめ、全ての扉は未固定
  • あなたと魔王でゲームをする
    • 先攻・後攻の情報が与えられる
    • 先攻から、以下を交互に繰り返す
      • あなたは未固定の扉を1つ選び、開いた状態で固定する
      • 魔王は未固定の扉を1つ選び、閉じた状態で固定する
    • S から T に、開いた状態の扉のみを通して移動できることが確定すればあなたの勝ち
    • 移動できないことが確定すればあなたの負け
  • H,W と、どちらが先攻かの情報が与えられた時点で、あなたが勝利可能か判定せよ
  • 勝利可能な場合、実際にジャッジとインタラクティブにゲームをして勝利せよ
  • 1H,W20

  |   |   |     (H,W)=(3,2) の盤面、
   --- ---
S |   |   | T   「|」および「---」が扉(計13個)
   --- ---
  |   |   |

解法

前提知識と必勝条件

シャノンのスイッチングゲーム」と呼ばれるゲームの一種である。
特にこのようなグリッド状に限定したものを指して、Galeのゲーム や Bridg-it とも呼ぶらしい。

各部屋と S,T を頂点、扉を辺と見なす。
あなたは辺を固定し、魔王は辺を削除して、ST を連結にできればあなたの勝ちとなる。

ゲームの必勝法として、グラフから「辺疎な(辺を共有しない)全域木を2つ取る」ことができれば、 後攻であっても、必ず全ての頂点を連結にできる。
当然 S,T も連結にできるので、勝利する。

全域木A
①--②--③-|-④--⑤--⑥    片方の全域木に属する辺が切られたときでも、

全域木B
     ,-------,,------,     もう一方の全域木はまるごと残っている。
①  ②  ③   ④  ⑤  ⑥    こっちの方で、分かれた成分同士を
|`------'`-------'   |     結ぶような辺(たとえば②-④)を選ぶことで
`--------------------'     

全域木A
①--(②④)--⑤--⑥         縮約したグラフでは、辺を共有しない全域木が2つある状態を維持できる
③--'

全域木B
⑤--③--①--⑥--(②④)

これを繰り返すと、全ての頂点が1つになるまで縮約(=全体を連結に)できることが示せる。

ただし、全域木が2つ取れないからといって、必敗とは限らないので注意。

勝利可能判定

さて、問題のグラフで辺は H×(W+1)+(H1)×W=2HW+HW 本ある。
一方、頂点は HW+2 個で、2つの全域木に必要な辺数は 2HW+2 本である。

少なくとも、2HW+HW2HW+2、つまり HW+2 であることが必要となる。

では、HW+2 なら構成できるのか?

以下のようにすると、必ず構成できる。

   A   B   A   B      (H,W) = (5,3)
    -A- -B- -A-       Aだけの扉(を辺と見立てたグラフ)も、
   B   A   B   A      Bだけの扉も、全域木を構成する
    -B- -A- -B-
S  A   B   A   B  T
    -A- -B- -A-
   B   A   B   A
    -B- -A- -B-
   A   B   A   B

また、H=W+1 の時、辺が1本だけ足りないのだが、

   A x B x A x B      (H,W) = (4,3)
    -A- -B- -A-
   B o A x B x A      Aは全域木となっているが、
o   -B- -A- -B-   x   Bが1本だけ足りず、完全には繋がらず
   A o B o A x B      o成分とx成分の2つに分かれている
    -A- -B- -A-
   B o A o B o A

先攻の場合、この2成分を初手で縮約する(たとえば左上の -A- を選ぶ)ことで、必勝法に持ち込める。

よって、「HW+2」または「H=W+1 かつあなたの先攻」の場合、勝利できる。

では、他の場合は必ず敗北するのか?
結論から言うと敗北する。以下、それを示す。

魔王からしてみると、扉の連結点を頂点と見立て、 これを閉じた扉によって上から下まで繋げることができれば、阻止が成功したと言える。

 ___ S___
/  /  \  \
|  |  |  |    (H,W) = (3,3)
o--o--o--o
|  |  |  |
o--o--o--o
|  |  |  |
\  \  /  /
 ~~~ T ~~

魔王にとっての必勝法も、このグラフから2つの全域木が取れればよいということになる。

全域木の構築の仕方もあなたの場合と同様にでき、結局、「HW」または「H=W+1 かつ魔王の先攻」なら、 魔王の必勝ということになり、ちょうどあなたの場合を逆にした条件であることが分かる。

実装

勝利可能で実際にゲームを行う場合、H,W が小さいので、愚直にUnion-Findなどで連結判定を毎回やってよい。

「2つの全域木」を取ろうとすると、HW+3 の時に辺があまりややこしいので、 木でなくなってもよいので上述のナナメ状に、辺を2つのグループA,Bに分ける。

相手がAに属する辺を削除してきたら、(既に固定済みの辺)+(未確定のAの辺)をUniteした後、

  • 全体が連結なら、適当に選んでよい(AとBの数の平衡を保つため、Bの方から適当に選んで固定する)
  • 2つに分かれているなら、Bから、両端が別々の連結成分に属する未確定の辺を探し、それを固定する

Python3

programming_algorithm/contest_history/atcoder/2023/1202_degwer2023.txt · 最終更新: 2024/03/13 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0