AtCoder Regular Contest 041 B – アメーバ をPython3で解く

Share

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

出典:
AtCoder Regular Contest 041 B – アメーバ

この手の問題は一行ずつ決定していけることが多い気がする。まずそこから考察していくといいかも。

# AtCoder Regular Contest 041 B - アメーバ
# https://atcoder.jp/contests/arc041/tasks/arc041_b
# tag: グリッド 考察

# 一番上の行から、順に決定できる。
# 分裂後の状態で一番上の行にアメーバがいるなら、
# 分裂前はひとつ下の行に同じ数のアメーバがいたことになる。
# すると、そのアメーバが上以外に分裂した個数も決定可能。
# 以下繰り返しで、順次決定していく。

def main():
N, M =map(int, input().split())

after = [[int(c) for c in input()] for _ in range(N)]
before = [[0] * M for _ in range(N)]

# 行ごとに見ていく
for y in range(N-1):
for x in range(M):
# 分裂後にアメーバがいるなら、
if after[y][x] > 0:
# 分裂前の一行下にアメーバが同じ数いる
before[y+1][x] = after[y][x]

# そのアメーバが分裂してできたアメーバを
# あらかじめ差し引いておく
after[y+1][x-1] -= after[y][x]
after[y+1][x+1] -= after[y][x]
after[y+2][x] -= after[y][x]

for r in before:
print(''.join(map(str, r)))

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です