AtCoder Grand Contest 004 C - AND Grid

「3月中に毎日1問解いて黄色になろう!」キャンペーン9問目。終盤なのでペースが上がってますが、体調は下がってます。

問題概要

H×Wのマップを赤と青で塗ると、重なった個所が紫になる。この紫の分布が与えられるので、適当に赤と青の分布を一つ復元せよ。一番外側は紫で無いことが保証されている。
H,W≦500

C - AND Grid

解説

最初は全面真っ赤に染めて、青が木=閉路が無いなら問題ないと考えました。しかし、青の実装がとても面倒になるので、うーんと適当に考えていましたが、市松模様を考えた時に分かりました。

市松模様をきれいに埋めるのが結構難しくて、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

感想

昼の間ずっと考えていたので、このレベルの問題の思考時間を短縮したいです。