結果

問題 No.86 TVザッピング(2)
ユーザー tnodino
提出日時 2022-03-05 21:00:13
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
WA  
実行時間 -
コード長 2,475 bytes
コンパイル時間 121 ms
コンパイル使用メモリ 12,416 KB
実行使用メモリ 10,880 KB
最終ジャッジ日時 2025-06-20 14:01:09
合計ジャッジ時間 2,826 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 28 WA * 2
権限があれば一括ダウンロードができます

ソースコード

diff #

def CheckPoint(N, M, L):
    P = []
    dx = [0, 0, 1, 1]
    dy = [0, 1, 0, 1]
    for x in range(N+1):
        for y in range(M+1):
            C = []
            flg = [False] * 4
            cnt = 0
            for i in range(4):
                nx,my = x + dx[i], y + dy[i]
                if L[nx][my] == '.':
                    C.append((nx, my))
                    flg[i] = True
                    cnt += 1
            if cnt % 2 == 0:
                continue
            if cnt == 1:
                X = C[0]
            elif cnt == 3:
                if flg[0] and flg[1] and flg[2]:
                    X = C[0]
                elif flg[0] and flg[1] and flg[3]:
                    X = C[1]
                elif flg[0] and flg[2] and flg[3]:
                    X = C[1]
                elif flg[1] and flg[2] and flg[3]:
                    X = C[2]
            if not X in P:
                P.append(X)
    return P

def Check4(L, P):
    def dfs(x, y, gx, gy, dx, dy):
        if x == gx and y == gy:
            return
        if L[x][y] == '#':
            print('NO')
            exit()
        L[x][y] = '#'
        dfs(x + dx, y + dy, gx, gy, dx, dy)
    X,Y = [list(i) for i in zip(*P)]
    dfs(X[0], Y[0], X[2], Y[2],  1,  0)
    dfs(X[2], Y[2], X[3], Y[3],  0,  1)
    dfs(X[3], Y[3], X[1], Y[1], -1,  0)
    dfs(X[1], Y[1], X[0], Y[0],  0, -1)
    return L

def Check6(L, P):
    def dfs(x, y, gx, gy, dx, dy):
        if x == gx and y == gy:
            return
        if L[x][y] == '#':
            print('NO')
            exit()
        L[x][y] = '#'
        dfs(x + dx, y + dy, gx, gy, dx, dy)
    X,Y = [list(i) for i in zip(*P)]
    dfs(X[2], Y[2], X[1], Y[1], -1,  0)
    dfs(X[1], Y[1], X[0], Y[0],  0, -1)
    dfs(X[0], Y[0], X[4], Y[4],  1,  0)
    dfs(X[4], Y[4], X[5], Y[5],  0,  1)
    dfs(X[5], Y[5], X[3], Y[3], -1,  0)
    dfs(X[3], Y[3], X[2], Y[2],  0, -1)
    return L

def CheckDots(N, M, L):
    for x in range(N+1):
        for y in range(M+1):
            if L[x][y] == '.':
                return False
    return True

N,M = map(int,input().split())
A = [list(input()) for _ in range(N)]
B = [['#'] * (M+2) for _ in range(N+2)]
for i in range(N):
    for j in range(M):
        B[i+1][j+1] = A[i][j]
P = CheckPoint(N, M, B)
if len(P) != 4 and len(P) != 6:
    print('NO')
    exit()
if len(P) == 4:
    B = Check4(B, P)
elif len(P) == 6:
    B = Check6(B, P)
if CheckDots(N, M, B):
    print('YES')
else:
    print('NO')
0