roiti46's blog

主に競プロ問題の解説を載せてます

TopCoder SRM 655 Div2: Easy

16回目のSRM。EasyMed提出でEasy通過、161位。1080 → 1097 (+17)。

問題はこちらから

問題

一辺50マス以下の正方形のボードが与えられる。ボードの各マスは白か黒か"?"である。各"?"には白か黒の好きな方の色を塗れるとしたとき、隣接するマスが同じ色にならないようにボードを塗ることができるかどうか答えよ。

解答

奇数マス、偶数マスでの各色の数を数えていけばいい。隣接するマスが同じ色にならないように塗れるのは、"?"マスを除いて、偶数マスには白のみで奇数マスには黒のみ、または偶数マスには黒のみで奇 数マスには白のみ、のどちらかのときのみ。この条件さえ満たせばあとは与えられた条件を満たすように"?"マスを塗ることができる。本番ではシミュレーションをしたが、こちらの方が早くて簡潔に書ける。

def ableToDraw(self, board):
    H,W = len(board),len(board[0])
    odd_W = odd_B = even_W = even_B = 0
    for y in xrange(H):
        for x in xrange(W):
            if board[y][x] == "B":
                if (y+x)%2 == 0:
                    even_B += 1
                else:
                    odd_B += 1
            if board[y][x] == "W":
                if (y+x)%2 == 0:
                    even_W += 1
                else:
                    odd_W += 1
    return "Possible" if (odd_W == even_B == 0 or even_W == odd_B == 0) else "Impossible"