演習課題「二次元のいもす法」
整数n,m,qとq回整数x1,y1,x2,y2,xが与えられます。
0で初期化された要素数n×mの二次元配列aに対し、各x1,y1,x2,y2,xについて左上を (x1,y1),右下を(x2,y2)とする長方形範囲にxを加算してください。
いもす法を用いてこれを処理し、最終的に得られる二次元配列aを出力してください。
入力を受け取るコードと二次元配列aをn行目m列目まで出力する関数print_2d_array(a,n,m) がすでに用意されているので、コードを書き足してプログラムを完成させてください。
期待する出力値
0 0 0 0 0
0 7 7 7 0
0 7 7 7 0
0 7 7 7 0
0 0 0 0 0
#07:二次元のいもす法
このチャプターでは、二次元のいもす法について学習します。
def print_2d_array(a, n, m):
print("\n".join(" ".join(map(str, x[:m])) for x in a[:n]))
n, m, x1, y1, x2, y2, x = map(int, input().split())
# 配列(リスト)aをサイズ(n+1)×(m+1)で用意
a = [[0] * (m+1) for _ in range(n+1)]
# a[x2+1][y2+1]にx,a[x2+1][y1]に-x,a[x1][y2+1]に-x,a[x1][y1]にxを加算
a[x2+1][y2+1] += x
a[x2+1][y1] -= x
a[x1][y2+1] -= x
a[x1][y1] += x
# iを0からn-1まで繰り返す
for i in range(n):
# jを1からm-1まで繰り返す
for j in range(1, m):
# a[i][j]にa[i][j-1]を加算
a[i][j] += a[i][j-1]
# jを0からm-1まで繰り返す
for j in range(m):
# iを1からn-1まで繰り返す
for i in range(1, n):
# a[i][j]にa[i-1][j]を加算
a[i][j] += a[i-1][j]
# aを出力
print_2d_array(a, n, m)
5 5 1 1 3 3 7