AtCoder Grand Contest 004 C - AND Grid
「3月中に毎日1問解いて黄色になろう!」キャンペーン9問目。終盤なのでペースが上がってますが、体調は下がってます。
問題概要
H×Wのマップを赤と青で塗ると、重なった個所が紫になる。この紫の分布が与えられるので、適当に赤と青の分布を一つ復元せよ。一番外側は紫で無いことが保証されている。
H,W≦500
解説
最初は全面真っ赤に染めて、青が木=閉路が無いなら問題ないと考えました。しかし、青の実装がとても面倒になるので、うーんと適当に考えていましたが、市松模様を考えた時に分かりました。
市松模様をきれいに埋めるのが結構難しくて、Eの字とヨの字を上手く組み合わせた後、紫の箇所だけ飛び出してもらうと上手く市松模様が出来ます。この方法は他の任意の模様に対しても適用可能だったので、これを実装します。まあ偶奇で分けるだけなのでとても簡単です。
Rubyで解きましたが、ショートコーディング出来るだけの知識が無いので、普通に長いです(可読性も高いです)。
https://beta.atcoder.jp/contests/agc004/submissions/2247237
h,w=gets.split(" ").map(&:to_i) a=[] h.times{a<<gets} puts "#"*w for i in 1..h-2 do out="" for j in 0...w do if j%2==1||a[i][j]=="#" then out+="#" else out+="." end end puts out end puts "."*w puts "" puts "."*w for i in 1..h-2 do out="" for j in 0...w do if j%2==0||a[i][j]=="#" then out+="#" else out+="." end end puts out end puts "#"*w
感想
昼の間ずっと考えていたので、このレベルの問題の思考時間を短縮したいです。