본문 바로가기

hacking sorcerer

deque solver

728x90

from collections import deque

def solve():
    n, m = map(int, input().split())
    grid = [input().strip() for _ in range(n)]

    # visited[r][c][k] = True means we've reached (r,c) with k walls broken
    # k=0: no wall broken yet, k=1: one wall already broken
    visited = [[[False, False] for _ in range(m)] for _ in range(n)]

    # BFS: state = (row, col, walls_broken_so_far)
    queue = deque()

    # Handle start cell: if it's a wall, we use our one break on it
    start_breaks = 1 if grid[0][0] == '#' else 0
    if start_breaks <= 1:
        visited[0][0][start_breaks] = True
        queue.append((0, 0, start_breaks))

    while queue:
        r, c, breaks = queue.popleft()

        # Reached the goal
        if r == n - 1 and c == m - 1:
            print("YES")
            return

        # Only right or down
        for dr, dc in [(1, 0), (0, 1)]:
            nr, nc = r + dr, c + dc

            if 0 <= nr < n and 0 <= nc < m:
                cell_is_wall = grid[nr][nc] == '#'
                new_breaks = breaks + (1 if cell_is_wall else 0)

                if new_breaks <= 1 and not visited[nr][nc][new_breaks]:
                    visited[nr][nc][new_breaks] = True
                    queue.append((nr, nc, new_breaks))

    print("NO")

solve()

728x90
반응형

'hacking sorcerer' 카테고리의 다른 글

heapq.py  (0) 2026.06.30
open the door  (0) 2026.06.22
mix and match game  (0) 2026.02.27
오랜만에 장동민 보다가  (0) 2026.02.04
mirror_swap.py  (0) 2026.01.21