tokizo

競技プログラミングの備忘録や日記

TPC追いコン-A 不完全迷路

一日溶かした

問題概要

atcoder.jp

スタートとゴールそれぞれのマスを含んだ迷路が与えられる

入力例5

7 8
.#......
S#.#.###
...#.#.#
###.#.G.
.....#..
..##.#.#
........

入力のままだとSからGには到達できない
一つの#.に変えることでSからGに到達が可能になる最短経路のうち、最大のものを答えよ

考察・解法

何を言ってるんだ…? 最短経路のうち最大…??!?!??!?

とりあえず最短経路なのでBFSだ

  • 全ての#.に変えたときを一つずつ見ていき、SからGの最短経路を求める
    → TLE (H, W <= 298でほぼ毎時BFSを行なったらヤバい)

  • SとGからそれぞれBFSし、お互いの領域から#を一つ挟んでいる箇所を探す
    → 半分WA (???????????)

長考の末、落ちるケースを発見した
以下の入力の場合を考えます

5 5
S....
.##.#
##.#.
.....
#.#.G

BFSで求めた各マスの最短経路は以下の様になる
f:id:fawula:20190317195725j:plain

以下では縦軸をx, 横軸をyとする
x = 2, y = 3の#を外す場合を考える (図の赤丸)
このときx = 2, y = 2 (赤丸の左)に移動すればSからGまでの経路は最大になるが、最短経路にはならない
ここさえ注意できればすぐできると思う

コード

atcoder.jp