PythonでJOI難易度6を埋める #24

A - JOI紋章(JOI Emblem)

実装の面倒さで難易度6にいる.私は気合で場合分けしました()

from sys import stdin
input = stdin.readline

m, n = map(int, input().strip().split())
flag = [input().strip() for _ in range(m)]
crest = [input().strip() for _ in range(2)]

def check(f1, f2, f3, f4, cre):
    if f1 == cre[0][0] and f2 == cre[1][0] and f3 == cre[0][1] and f4 == cre[1][1]:
        return 1
    else:
        return 0

tmp = 0
for i in range(m - 1):
    for j in range(n - 1):
        if check(flag[i][j], flag[i + 1][j], flag[i][j + 1], flag[i + 1][j + 1], crest):
            tmp += 1

char = ['J', 'O', 'I']
ans = 0
for i in range(m):
    for j in range(n):
        if i == 0 and j == 0: #左上
            '''
            | 1 | 3 |
            | 2 | 4 |
            '''
            f1 = flag[i][j]
            f2 = flag[i + 1][j]
            f3 = flag[i][j + 1]
            f4 = flag[i + 1][j + 1]
            if check(f1, f2, f3, f4, crest):
                continue
            for k in char:
                if k == f1:
                    continue
                if check(k, f2, f3, f4, crest):
                    ans = max(tmp + 1, ans)

        elif i == m - 1 and j == n - 1: #右下
            '''
            | 1 | 3 |
            | 2 | 4 |
            '''
            f1 = flag[i - 1][j - 1]
            f2 = flag[i][j - 1]
            f3 = flag[i - 1][j]
            f4 = flag[i][j]
            if check(f1, f2, f3, f4, crest):
                continue
            for k in char:
                if k == f4:
                    continue
                if check(f1, f2, f3, k, crest):
                    ans = max(tmp + 1, ans)

        elif i == 0 and j == n - 1: #右上
            '''
            | 1 | 3 |
            | 2 | 4 |
            '''
            f1 = flag[i][j - 1]
            f2 = flag[i + 1][j - 1]
            f3 = flag[i][j]
            f4 = flag[i + 1][j]
            if check(f1, f2, f3, f4, crest):
                continue
            for k in char:
                if k == f3:
                    continue
                if check(f1, f2, k, f4, crest):
                    ans = max(tmp + 1, ans)

        elif i == m - 1 and j == 0: #左下
            '''
            | 1 | 3 |
            | 2 | 4 |
            '''
            f1 = flag[i - 1][j]
            f2 = flag[i][j]
            f3 = flag[i - 1][j + 1]
            f4 = flag[i][j + 1]
            if check(f1, f2, f3, f4, crest):
                continue
            for k in char:
                if k == f2:
                    continue
                if check(f1, k, f3, f4, crest):
                    ans = max(tmp + 1, ans)

        elif i == 0 and 0 < j < n - 1: #上
            '''
            | 5 | 1 | 3 |
            | 6 | 2 | 4 |
            '''
            f1 = flag[i][j]
            f2 = flag[i + 1][j]
            f3 = flag[i][j + 1]
            f4 = flag[i + 1][j + 1]
            f5 = flag[i][j - 1]
            f6 = flag[i + 1][j - 1]
            if check(f1, f2, f3, f4, crest) or check(f5, f6, f1, f2, crest):
                continue
            for k in char:
                if k == f1:
                    continue
                if check(k, f2, f3, f4, crest) and check(f5, f6, k, f2, crest):
                    ans = max(tmp + 2, ans)
                elif check(k, f2, f3, f4, crest) or check(f5, f6, k, f2, crest):
                    ans = max(tmp + 1, ans)

        elif 0 < i < m - 1 and j == 0: #左
            '''
            | 5 | 6 |
            | 1 | 3 |
            | 2 | 4 |
            '''
            f1 = flag[i][j]
            f2 = flag[i + 1][j]
            f3 = flag[i][j + 1]
            f4 = flag[i + 1][j + 1]
            f5 = flag[i - 1][j]
            f6 = flag[i - 1][j + 1]
            if check(f1, f2, f3, f4, crest) or check(f5, f1, f6, f3, crest):
                continue
            for k in char:
                if k == f1:
                    continue
                if check(k, f2, f3, f4, crest) and check(f5, k, f6, f3, crest):
                    ans = max(tmp + 2, ans)
                elif check(k, f2, f3, f4, crest) or check(f5, k, f6, f3, crest):
                    ans = max(tmp + 1, ans)

        elif i == m - 1 and 0 < j < n - 1: #下
            '''
            | 1 | 3 | 5 |
            | 2 | 4 | 6 |
            '''
            f1 = flag[i - 1][j - 1]
            f2 = flag[i][j - 1]
            f3 = flag[i - 1][j]
            f4 = flag[i][j]
            f5 = flag[i - 1][j + 1]
            f6 = flag[i][j + 1]
            if check(f1, f2, f3, f4, crest) and check(f3, f4, f5, f6, crest):
                continue
            for k in char:
                if k == f4:
                    continue
                if check(f1, f2, f3, k, crest) and check(f3, k, f5, f6, crest):
                    ans = max(tmp + 2, ans)
                elif check(f1, f2, f3, k, crest) or check(f3, k, f5, f6, crest):
                    ans = max(tmp + 1, ans)

        elif 0 < i < m - 1 and j == n - 1: #右
            '''
            | 3 | 6 |
            | 2 | 5 |
            | 1 | 4 |
            '''
            f1 = flag[i + 1][j - 1]
            f2 = flag[i][j - 1]
            f3 = flag[i - 1][j - 1]
            f4 = flag[i + 1][j]
            f5 = flag[i][j]
            f6 = flag[i - 1][j]
            if check(f3, f2, f6, f5, crest) and check(f2, f1, f5, f4, crest):
                continue
            for k in char:
                if k == f5:
                    continue
                if check(f3, f2, f6, k, crest) and check(f2, f1, k, f4, crest):
                    ans = max(tmp + 2, ans)
                elif check(f3, f2, f6, k, crest) or check(f2, f1, k, f4, crest):
                    ans = max(tmp + 1, ans)

        else:
            '''
            | 1 | 2 | 3 |
            | 4 | 5 | 6 |
            | 7 | 8 | 9 |
            '''
            f1 = flag[i - 1][j - 1]
            f2 = flag[i - 1][j]
            f3 = flag[i - 1][j + 1]
            f4 = flag[i][j - 1]
            f5 = flag[i][j]
            f6 = flag[i][j + 1]
            f7 = flag[i + 1][j - 1]
            f8 = flag[i + 1][j]
            f9 = flag[i + 1][j + 1]
            cnt = check(f1, f4, f2, f5, crest) + check(f2, f5, f3, f6, crest) + check(f4, f7, f5, f8, crest) + check(f5, f8, f6, f9, crest)
            if cnt >= 2:
                continue
            for k in char: #cnt = 0, 1
                if k == f5:
                    continue
                ans = max(tmp - cnt + check(f1, f4, f2, k, crest) + check(f2, k, f3, f6, crest) + check(f4, f7, k, f8, crest) + check(k, f8, f6, f9, crest), ans)

if ans == 0:
    print(tmp)
else:
    print(ans)