AtCoder Beginner Contest 090 C問題
C問題
難易度:茶色
回答時間は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)