考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

ABC047-B - すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit) を解く

ABC047-B - すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit)

 

前回に引き続きまたも数学的な問題

結構難しそう…

 

書かれている通りシミュレーションができれば答えは求められそうだが

どのようなプログラムを書けばいいのか想像がつきにくい

 

今回は、白い部分の範囲の左下と右上の座標の初期値が与えられているので

塗りつぶし作業を行なった後に、座標の値に変化がある場合は

随時更新していく方法でいくことにする

 

以上を踏まえて書いたコードを以下に示す

 

提出したコード

# 入力
W,H,N=map(int,input().split())

# 左下の座標
X=Y=0

for i in range(N):
  # 入力
  x,y,a=map(int,input().split())

  if a==1:
    X=max(X,x)
  elif a==2:
    W=min(W,x)
  elif a==3:
    Y=max(Y,y)
  else:
    H=min(H,y)

# 出力
print(max(W-X,0)*max(H-Y,0))

 

max, min 関数を使うことで

更新後の座標の値を簡単に求めていることに注目してほしい

 

また、最後の出力部分について補足が一つ

 

このコードは、右上の x座標、y座標から、左下の x座標、y座標を引くことで

縦と横の辺の長さを求め、掛け合わせることで面積を求めている部分である

 

# 出力
print(max(W-X,0)*max(H-Y,0))

 

ここで、なぜ 0 とmax 関数で比較をしているかというと

塗りつぶしをした結果、辺の長さが負になる場合があり、それを考慮せず

計算してしまうと、面積が負の値になってしまうことがあるためである

 

この場合は、すべて黒く塗りつぶしてしまった場合に該当する

そのときの面積は 0 とするべきであるので、辺の長さが負になる場合は

0 とするように調整を行なっている

 

提出結果はACでした