이번 문제는 단순하게 while문으로 이동하는 방법과 bfs를 이용하는 방법 두가지로 풀어보았다. 출구를 찾는 함수, 거울을 만났을 때 방향을 바꾸는 함수를 구현하였고, 이를 이용하여 이동하는 함수를 구현하였다.
def move(y, x, d):
while 0<=y<n and 0<=x<m:
if grid[y][x]==1:
d=find_dir(d)
y+=dy[d]
x+=dx[d]
answer.append(str(get_result(y, x)))
def move1(y, x, d):
if grid[y][x]==1:
d=find_dir(d)
q=deque()
q.append((y, x, d))
while q:
sy, sx, sd=q.popleft()
ny, nx=sy+dy[sd], sx+dx[sd]
if 0<=ny<n and 0<=nx<m:
if grid[ny][nx]==1:
sd=find_dir(sd)
q.append((ny, nx, sd))
else:
answer.append(str(get_result(ny, nx)))
from collections import deque
n, m=map(int, input().split())
grid=[list(map(int, input().split())) for _ in range(n)]
dy, dx=[-1, 0, 1, 0], [0, 1, 0, -1]
answer=[]
def get_result(y, x):
if y==-1:
return 2*n+2*m-x
elif x==-1:
return y+1
elif y==n:
return n+x+1
else:
return 2*n+m-y
def find_dir(d):
if d==0:
return 1
elif d==1:
return 0
elif d==2:
return 3
else:
return 2
def move(y, x, d):
while 0<=y<n and 0<=x<m:
if grid[y][x]==1:
d=find_dir(d)
y+=dy[d]
x+=dx[d]
answer.append(str(get_result(y, x)))
def move1(y, x, d):
if grid[y][x]==1:
d=find_dir(d)
q=deque()
q.append((y, x, d))
while q:
sy, sx, sd=q.popleft()
ny, nx=sy+dy[sd], sx+dx[sd]
if 0<=ny<n and 0<=nx<m:
if grid[ny][nx]==1:
sd=find_dir(sd)
q.append((ny, nx, sd))
else:
answer.append(str(get_result(ny, nx)))
for i in range(n):
move1(i, 0, 1)
for i in range(m):
move1(n-1, i, 0)
for i in range(n-1, -1, -1):
move1(i, m-1, 3)
for i in range(m-1, -1, -1):
move1(0, i, 2)
print(*answer)