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())