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)