ABC307C - Ideal Sheet

考え方

A, B, Xは少なくとも1つの黒マスを含むため,A, BはXと必ず重なる.
Xの左上のマスの座標を(9, 9)として,A, Bそれぞれの左上のマスが(0, 0)〜(19, 19)となる場合を全探索する.

全部の黒マスを使ったかどうかをsetで管理する.

回答例

HA, WA = map(int, input().split())
A = [list(input()) for _ in range(HA)]
HB, WB = map(int, input().split())
B = [list(input()) for _ in range(HB)]
HX, WX = map(int, input().split())
X = [list(input()) for _ in range(HX)]

PA = set((i, j) for i in range(HA) for j in range(WA) if A[i][j]=='#')
PB = set((i, j) for i in range(HB) for j in range(WB) if B[i][j]=='#')

for xA in range(20):
    for yA in range(20):
        for xB in range(20):
            for yB in range(20):
                flag = False
                PA2 = set()
                PB2 = set()
                for i in range(HX):
                    for j in range(WX):
                        x = i + 9
                        y = j + 9
                        col = '.'
                        if (0 <= x - xA < HA
                            and  0 <= y - yA < WA
                            and A[x-xA][y-yA] == '#'):
                            col = '#'
                            PA2.add((x - xA, y - yA))
                        if (0 <= x - xB < HB
                            and 0 <= y - yB < WB
                            and B[x-xB][y-yB] == '#'):
                            col = '#'
                            PB2.add((x - xB, y - yB))

                        if X[i][j] != col:
                            flag = True
                            break
                    if flag:
                        break
    
                if not flag and PA == PA2 and PB == PB2:
                    exit(print('Yes'))
print('No')