# n, m, x, y, k 입력
n, m, x, y, k = map(int, input().split())
# grid 입력
grid = [
list(map(int, input().split()))
for _ in range(n)
]
# order_list 입력
order_list = list(map(int, input().split()))
# 함수들
# in_range(x, y)
def in_range(x, y):
return 0 <= x < n and 0 <= y < m
# move_down(r, c)
def move_down(r, c):
# 전역 변수 선언
global grid, up, front, down, back, x, y
# 아래쪽 칸의 좌표
nx, ny = r + 1, c
# 아래쪽으로 굴렸을 때 각 면
next_up = back
next_front = up
next_down = front
next_back = down
# 아래쪽 칸에 쓰여 있는 수가 0이면,
if not grid[nx][ny]:
# 주사위 바닥면에 있는 수가 칸에 복사
grid[nx][ny] = next_down
# 0이 아니면
else:
# 주사위 바닥면에 복사
next_down = grid[nx][ny]
# 칸의 숫자는 0으로
grid[nx][ny] = 0
# 주사위 면 관리
up = next_up
back = next_back
down = next_down
front = next_front
# 좌표 관리
x, y = nx, ny
# move_up(r, c)
def move_up(r, c):
# 전역 변수 선언
global grid, up, front, down, back, x, y
# 위쪽 칸의 좌표
nx, ny = r - 1, c
# 위쪽으로 굴렸을 때의 각 면
next_up = front
next_back = up
next_down = back
next_front = down
# 위쪽 칸에 쓰여 있는 수가 0이면,
if not grid[nx][ny]:
# 주사위 바닥면에 있는 수가 칸에 복사
grid[nx][ny] = next_down
# 0이 아니면,
else:
# 주사위 바닥면에 복사
next_down = grid[nx][ny]
# 칸의 숫자는 0으로
grid[nx][ny] = 0
# 주사위 면 관리
up = next_up
back = next_back
down = next_down
front = next_front
# 좌표 관리
x, y = nx, ny
# move_left(r, c)
def move_left(r, c):
# 전역 변수 선언
global grid, up, down, right, left, x, y
# 왼쪽 칸의 좌표
nx, ny = r, c - 1
# 왼쪽으로 굴렸을 때의 각 면
next_up = right
next_left = up
next_down = left
next_right = down
# 왼쪽 칸에 쓰여 있는 수가 0이면,
if not grid[nx][ny]:
# 주사위 바닥면에 있는 수가 칸에 복사
grid[nx][ny] = next_down
# 0이 아니면,
else:
# 주사위 바닥면에 복사
next_down = grid[nx][ny]
# 칸의 숫자는 0으로
grid[nx][ny] = 0
# 주사위 면 관리
up = next_up
down = next_down
right = next_right
left = next_left
# 좌표 관리
x, y = nx, ny
# move_right(r, c)
def move_right(r, c):
# 전역 변수 선언
global grid, up, down, right, left, x, y
# 오른쪽 칸의 좌표
nx, ny = r, c + 1
# 오른쪽으로 굴렸을 때의 각 면
next_up = left
next_right = up
next_down = right
next_left = down
# 오른쪽 칸에 쓰여 있는 수가 0이면,
if not grid[nx][ny]:
# 주사위 바닥면에 있는 수가 칸에 복사
grid[nx][ny] = next_down
# 0이 아니면,
else:
# 주사위 바닥면에 복사
next_down = grid[nx][ny]
# 칸의 숫자는 0으로
grid[nx][ny] = 0
# 주사위 면 관리
up = next_up
right = next_right
down = next_down
left = next_left
# 좌표 관리
x, y = nx, ny
# 설계
# 주사위의 위, 아래, 오른쪽, 왼쪽, 앞, 뒤 값 배정
up, down, right, left, front, back = 0, 0, 0, 0, 0, 0
for order in order_list:
# 동쪽 이동
if order == 1:
# 범위 내에 있으면,
if in_range(x, y + 1):
# 오른쪽으로 움직여주고
move_right(x, y)
# 주사위 윗값 출력,
print(up)
# 서쪽 이동
elif order == 2:
if in_range(x, y - 1):
move_left(x, y)
print(up)
# 북쪽 이동
elif order == 3:
if in_range(x-1, y):
move_up(x, y)
print(up)
# 남쪽 이동
else:
if in_range(x + 1, y):
move_down(x, y)
print(up)
'Algorithm(BOJ, Python) > Simulation' 카테고리의 다른 글
[백준_14891] 톱니바퀴 python (0) | 2022.09.17 |
---|---|
[백준_2174] 로봇 시뮬레이션 python (2) | 2022.09.16 |
[백준_14503] 로봇청소기 python (0) | 2022.08.28 |
[백준_5215] 지구온난화 python (0) | 2022.08.09 |
[백준_1063] 킹 python (0) | 2022.08.04 |