AtCoder Beginner Contest 109 D – Make Them Even をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 109 D – Make Them Even

全てのマスを順に見ていきつつ移動していけばいい。最後のマスに余ったコインを集約させるようなイメージ。

# AtCoder Beginner Contest 109 D - Make Them Even
# https://atcoder.jp/contests/abc109/tasks/abc109_d
# tag: グリッド 隣接操作

# 条件を逆にいうと、全マス一回ずつ操作が可能。

# そこで、一番上の行から、各行ごとに順にマスを見ていき、
# コインが奇数枚なら一行下へ 1枚移動させていく。

# 最後の行は、左端から順に見ていき、奇数枚なら
# ひとつ右へと移動させることにする。

# これで、少なくとも一番右下のマス以外を、全て偶数に
# することができる。

def main():
    H, W = map(int, input().split())
    field = [list(map(int, input().split())) for _ in range(H)]

    result = []

    # 各行ごとに見ていく。
    for y in range(H-1):
        for x in range(W):
            # 奇数なら、ひとつ下へ 1枚移動。
            if field[y][x] % 2 != 0:
                field[y][x] -= 1
                field[y+1][x] += 1
                result.append([y+1, x+1, y+2, x+1])

    # 最後の行。
    for x in range(W-1):
        # 奇数なら、ひとつ右へ 1枚移動。
        if field[H-1][x] % 2 != 0:
            field[H-1][x] -= 1
            field[H-1][x+1] += 1
            result.append([H, x+1, H, x+2])

    print(len(result))
    for r in result:
        print(*r)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。