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

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

1600๋ฒˆ: ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— ๊ฒฉ์žํŒ์˜ ๊ฐ€๋กœ๊ธธ์ด W, ์„ธ๋กœ๊ธธ์ด H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ H์ค„์— ๊ฑธ์ณ W๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, 0์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ํ‰์ง€, 1์€ ์žฅ์• ๋ฌผ์„ ๋œปํ•œ๋‹ค. ์žฅ์• ๋ฌผ์ด ์žˆ๏ฟฝ๏ฟฝ

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ๋ฌธ์ œ์—์„œ ์›์ˆญ์ด๋Š” K๋ฒˆ ๋™์•ˆ, ๋‚˜์ดํŠธ์˜ ์ด๋™๊ณผ ๊ฐ™์ด 8 ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ดํ›„์—๋Š” ์ƒ, ํ•˜, ์ขŒ, ์šฐ ํ•œ์นธ์”ฉ ์›€์ง์ด๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, ์ตœ์†Œ์˜ ํšŸ์ˆ˜๋กœ ์šฐ์ธก ํ•˜๋‹จ ์•„๋ž˜์˜ ์ขŒํ‘œ๋กœ ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด๋Š” ๋ฒฝ์„ K๋ฒˆ ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋Š” ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2์™€ ์œ ์‚ฌํ•œ ๋กœ์ง์œผ๋กœ ํ’€๋ฉด ๋œ๋‹ค.

 

  • BFS๋ฅผ ํ†ตํ•ด, K๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ง, ์›์ˆญ์ด ์ฒ˜๋Ÿผ ์ด๋™๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • K๊ฐ€ ์—†๋‹ค๋ฉด, ์›์ˆญ์ด ์ฒ˜๋Ÿผ ์ด๋™๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๋ง ์ฒ˜๋Ÿผ ์ด๋™ํ•œ ํšŸ์ˆ˜์— ๋”ฐ๋ผ ๋ฐฉ๋ฌธ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
    • ์ด๋ฅผ ์œ„ํ•ด `visited`๋ฅผ x, y, ๋ง์ฒ˜๋Ÿผ ์ด๋™ํ•œ ํšŸ์ˆ˜๋กœ ํ•˜์—ฌ 3์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค.
    • `visited`๋Š” ๋‹จ์ˆœํžˆ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ธฐ์กด์˜ ๊ฒฝ๋กœ์—์„œ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋ˆ„์ ํ•œ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin
from collections import deque


def visitable(x, y, next_k):
    return 0 <= x < h and 0 <= y < w and not visited[x][y][next_k] and not graph[x][y]


def bfs(start):
    q = deque([start])

    horse_dirs = ((-1, 2), (1, 2), (2, 1), (2, - 1),
                  (1, -2), (-1, -2), (-2, -1), (-2, 1))
    monkey_dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))

    while q:
        x, y, cur_k = q.popleft()

        if (x, y) == (h - 1, w - 1):
            return visited[x][y][cur_k]

        dirs = monkey_dirs + horse_dirs if cur_k > 0 else monkey_dirs

        for idx, delta in enumerate(dirs):
            next_x, next_y = x + delta[0], y + delta[1]
            next_k = cur_k - 1 if idx > 3 else cur_k

            if visitable(next_x, next_y, next_k):
                q.append((next_x, next_y, next_k))
                visited[next_x][next_y][next_k] = visited[x][y][cur_k] + 1
    return -1


if __name__ == '__main__':
    k = int(stdin.readline())
    w, h = map(int, stdin.readline().split())
    graph = [list(map(int, stdin.readline().split())) for _ in range(h)]
    visited = [[[0] * (k + 1) for _ in range(w)]for _ in range(h)]
    print(bfs((0, 0, k)))

 3์ฐจ์› ๋ฐฐ์—ด๋กœ `visited`๋ฅผ ๋งŒ๋“ค์–ด์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ฐ”๋กœ ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ•˜์—ฌ, ์ด๋ฆฌ์ €๋ฆฌ ํ—ค๋งค์„œ ์‹œ๊ฐ„์„ ์ข€ ์ป๋‹ค.๐Ÿ˜…

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