d_tail's blog

備忘や記録

【精進記録】AtCoder Regular Contest 091 C - Flip,Flip, and Flip......

問題

beta.atcoder.jp

解法

解法を思いつくまでにそこそこ時間がかかった&コーナーケースで躓いたけどなんとか解説を見ずにAC.

N = 1かつM = 1 の場合は1,N = 1 かつM ≠ 1の場合は(M-2),M = 1かつN ≠ 1の場合は(N-2)となる.

この場合以外のN ≧ 2 かつM ≧ 2の場合,裏返す回数を数えると四隅が4回,四隅を除く辺部分が6回,それ以外のカードは9回裏返されることになるため,9回裏返されるカードの数を数えれば良い.
9回裏返される部分は外周以外のカードなので,(N-2)*(M-2)となる.

裏返す回数を図示してみることで解法に気づくことができた.

ただ,提出したコードでは無駄にN = 2またはM = 2の場合の条件も書いてしまった.

図示して検討したパターン

f:id:d_tail:20181103164338p:plain

コード

N,M = map(int,input().split())
 
if N == 2 or M == 2:
    print(0)
    exit()
 
if N == 1:
    if M == 1:
        print(1)
    else:
        print(M-2)
    exit()
 
if M == 1:
    print(N-2)
    exit()
 
print((N-2)*(M-2))

コメント

前回の問題でも思ったが,わからない場合はとにかく図示してみるのが有効そう.