ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

Nร—M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๏ฟฝ๏ฟฝ

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ์ด๋™ํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ ๋ฒฝ ํ•˜๋‚˜๋ฅผ ๋ถ€์ˆ˜๊ณ  ํƒ์ƒ‰์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ฒฝ ํ•˜๋‚˜๋ฅผ ๋ถ€์ˆ  ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ (N, M)์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ณดํ†ต ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ, 2์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ์ด๋™ํ•œ ๊ฑฐ๋ฆฌ๋ฅผ ์ค‘์ฒฉ์‹œ์ผœ๋ฉฐ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋ฉฐ ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•œ ๊ฒฝ์šฐ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค. ๋ฌธ์ œ์—์„œ๋Š” ๋ฒฝ์„ ๋ถ€์ˆœ ๊ฒฝ์šฐ์™€ ๋ถ€์ˆ˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 2๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ์— ๊ธฐ์กด์— ๊ฑฐ๋ฆฌ๋ฅผ ์ค‘์ฒฉํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ 3์ฐจ์› ๋ฐฐ์—ด์„ ํ†ตํ•ด ๋ถ€์ˆœ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋„ ๋”ฐ๋กœ ์ค‘์ฒฉ์‹œํ‚จ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin
from collections import deque


def visitable(x, y, w):
    return 0 <= x < n and 0 <= y < m and not visited[x][y][w]


def bfs(start):
    q = deque([start])
    dirs = ((-1, 0), (0, 1), (1, 0), (0, -1))

    while q:
        cur_x, cur_y, wall = q.popleft()
        dist = visited[cur_x][cur_y][wall] + 1

        if [cur_x, cur_y] == [n - 1, m - 1]:
            return visited[cur_x][cur_y][wall]

        for x, y in dirs:
            next_x, next_y = cur_x + x, cur_y + y
            if visitable(next_x, next_y, wall):
                if not graph[next_x][next_y]:
                    visited[next_x][next_y][wall] = dist
                    q.append((next_x, next_y, wall))
                elif not wall:
                    visited[next_x][next_y][not wall] = dist
                    q.append((next_x, next_y, not wall))

    return -1


if __name__ == '__main__':
    n, m = map(int, stdin.readline().split())
    graph = [list(map(int, stdin.readline().strip())) for _ in range(n)]
    visited = [[[0, 0] for _ in range(m)] for _ in range(n)]
    visited[0][0] = [1, 1]
    print(bfs((0, 0, 0)))

 

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€