알고리즘/BOJ

[BOJ 15906, Python 3] 변신 이동 게임

70825 2021. 9. 8. 15:07
반응형

https://www.acmicpc.net/problem/15906

 

15906번: 변신 이동 게임

첫 줄에 2차원 격자의 크기 N(1≤ N ≤ 500), 일반 모드에서 변신 모드로 변신하는 데 소모되는 턴의 수 t(0 ≤ t ≤ 500), 목표 지점의 행과 열의 번호 r(1 ≤ r ≤ N), c(1 ≤ c ≤ N)가 주어진다. 다음 줄에

www.acmicpc.net

 

 

풀이

처음엔 BFS를 생각해볼 수 있는데 일반 이동은 (이동 횟수) + 1이지만, 변신모드로 변할 때는 (이동 횟수) + t가 되기 때문에 이걸 단순 큐에 넣어서 풀어보면 이미 방문한 경로가 다시 업데이트될 수도 있기 때문에 시간이 오래 걸리므로 다익스트라 알고리즘을 생각해볼 수 있습니다.

 

방문 방법은 visit 배열 2개로 나눠 각각 변신모드로 이동할 때와 일반모드로 이동할 때로 나누고, 문제 본문에서 변신 모드를 사용하여 워프로 이동할 때에는 상하좌우방향으로 각각 가까운 워프로만 이동할 수 있기 때문에 while문을 이용하여 각 방향에서 찾을 수 있는 워프를 찾아 우선순위큐에 넣어주면 됩니다.

 

 

 

거의 2.5년전에 풀다가 포기 했었는데 드디어 풀었네요

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from heapq import *
input = __import__('sys').stdin.readline
dx, dy = [1-100], [001-1]
MAX = 9876543210
 
n, t, r, c = map(int, input().split())
MAP = [input() for _ in range(n)]
visit = [[[MAX]*for _ in range(n)] for __ in range(2)]; visit[0][0][0= 0
= []; heappush(q, [0000])
 
while q:
    val, x, y, s = heappop(q)
    if s == 1 and visit[0][x][y] > val: visit[0][x][y] = val
    for i in range(4):
        nx, ny = x+dx[i], y+dy[i]
        if 0 <= nx < n and 0 <= ny < n and visit[0][nx][ny] > val + 1:
            visit[0][nx][ny] = val + 1
            heappush(q, [val+1, nx, ny, 0])
    if s == 0 and visit[1][x][y] > val + t:
        visit[1][x][y] = val + t
        heappush(q, [val+t, x, y, 1])
    if s == 1:
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            flag = False
            while 0 <= nx < n and 0 <= ny < n:
                if MAP[nx][ny] == '#': flag = True; break
                nx, ny = nx + dx[i], ny + dy[i]
            if flag and visit[1][nx][ny] > val + 1:
                visit[1][nx][ny] = val + 1
                heappush(q, [val+1, nx, ny, 1])
print(visit[0][r-1][c-1])
cs
반응형