백준 1726 로봇

wook2·2022년 6월 9일
0

알고리즘

목록 보기
99/117

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

이전에 bfs + 상태별 방문배열 유형을 여러개 풀어봐서 이 문제도 익숙했다.
최단거리를 구하는데, 방향에 따라 상태를 다르게 저장해야 하는것을 보고 bfs+방향별 방문배열로 해결하기로 했다.

문제에는 방향이 동서남북으로 1,2,3,4로 주어지는데 위와 같은 방법으로는 90도 회전하는데 방향이 일관성 있게 바뀌지 못한다
그래서 내가 주로 하던 방식대로 위 오른쪽 아래 왼쪽을 0,1,2,3으로 세팅하고 해결하였다.
후에 방향을 d라고 하면 d = (d+4) % 4로 계산한다면 어느 방향이던지 오른쪽으로 가면 +1, 왼쪽으로 가면 -1만 해주면 되기 때문이다.

또한 Go 명령을 할때는 칸이 막혀있다면 뒤에 있는 칸은 접근할 수 없으니 적절히 break 쳐줄것..

from collections import deque
def change_direction(d):
    if d == 1:
        return 1
    elif d == 2:
        return 3
    elif d == 3:
        return 2
    elif d == 4:
        return 0

def bfs():
    q = deque([])
    q.append((sx,sy,sd))
    visited[sx][sy][sd] = 0
    while q:
        x,y,d = q.popleft()
        if x == des_x and y == des_y and d == des_d:
            return visited[x][y][d]
        for i in range(1,4):
            nx = x + dx[d]*i
            ny = y + dy[d]*i
            if 0 <= nx < n and 0 <= ny < m:
                if arr[nx][ny] == 1:
                    break
                if visited[nx][ny][d] == -1:
                    visited[nx][ny][d] = visited[x][y][d] + 1
                    q.append((nx,ny,d))
        for k in [-1,1]:
            nd = (d+k) % 4
            if visited[x][y][nd] == -1:
                visited[x][y][nd] = visited[x][y][d] + 1
                q.append((x,y,nd))

n,m = map(int,input().split())
arr = []
for i in range(n):
    arr.append(list(map(int,input().split())))
dx = [-1,0,1,0]
dy = [0,1,0,-1]
sx,sy,sd = list(map(int,input().split()))
sx-= 1; sy -=1;
sd = change_direction(sd)
des_x,des_y,des_d = list(map(int,input().split()))
des_x-=1; des_y-=1;
des_d = change_direction(des_d)
visited = [[[-1]*4 for i in range(m)] for i in range(n)]

print(bfs())
profile
꾸준히 공부하자

0개의 댓글