AtCoder Beginner Contest 090 C問題

C問題

難易度:茶色

atcoder.jp


回答時間は10~15分。
規則性をすぐに理解できました。

N行M列に並べられたカードがあります。
それぞれのカードを裏返すのですが、
各マスにおいて点と辺で隣接する8マス+該当の1マスを裏返します。
最終的に裏向きなのは何枚かを解く問題。

  • N行M列の端
  • N行M列の外側マス
  • N行M列の内側

で場合分け。

N=2, M=2マス以上の場合

N行M列の端

N行M列の端は4マス存在します。
周囲の3マス+当の1マスにより、合計4回の裏返し。
つまり表です。

N行M列の外側マス

N行M列の端は(N-2)*2+(M-2)*2マス存在します。
周囲の5マス+当の1マスにより、合計6回の裏返し。
つまり表です。

N行M列の内側

N行M列の内側はN*M - (N行M列の端) - (N行M列の外側マス)です。
周囲の8マス+当の1マスにより、合計9回の裏返し。
奇数なのでつまり裏です。

裏になるカード数は

N*M-4-(N-2)*2-(M-2)*2

1行1列の場合

裏です。

N行1列、もしくは 1行M列場合

端の2マス以外は裏です。

最終コード

N,M = map(int, input().split())

if min(N,M)>1:
  print(N*M-4-(N-2)*2-(M-2)*2)
elif max(N,M)==1:
  print(1)
elif min(N,M)==1:
  print(max(N,M)-2)