[파이썬] 백준 19236번 청소년 상어
작성:
백준 #19236 청소년 상어
# 각 물고기는 번호 & 방향 가짐
# 4 X 4 공간, 1 <= 번호 <= 16, 자연수
# 두 물고기는 다른 번호
# 8방향
# 청소년 상어 - 0,0 물고기부터 시작, (0,0에 있던 물고기 방향)
# 물고기는 한 칸 이동, 그다음 상어 이동
# 상어 or 밖으로 나가면 못감, 이동할 수 있을 때까지 45도 반시계 회전
# 다른 물고기 칸으로 이동하면 서로 위치바꿈
# 상어 - 여러 개 칸 이동 가능, 물고기 있는 칸으로만 이동가능
# 출력: 상어가 먹을 수 있는 물고기 번호 합의 최댓값
# 상어가 먹은 물고기 번호 백트래킹 해야할듯..?
# field - 물고기 없음: 0, 물고기: 튜플, 상어: -1
# 1. 번호 작은 물고기부터 선택 & 이동
# 좌표는 번호를 index로 해서 배열에 넣어두기
# 방향도 함께 넣어두기 (0부터 시작)
# 2. 상어 이동 & 물고기 번호 합 (백트래킹)
from copy import deepcopy
def move_fish(field, coor):
global d
for i in range(1, 17):
if coor[i]:
fy, fx, direc = coor[i]
for j in range(8):
ny = fy + d[(direc + j) % 8][0]
nx = fx + d[(direc + j) % 8][1]
if 0 <= ny < 4 and 0 <= nx < 4 and field[ny][nx] != -1:
if field[ny][nx]:
tar_num, tar_dir = field[ny][nx]
field[fy][fx], field[ny][nx] = field[ny][nx], field[fy][fx]
field[ny][nx][1] = (direc + j) % 8 # field에서 방향
coor[i][0], coor[tar_num][0] = coor[tar_num][0], coor[i][0]
coor[i][1], coor[tar_num][1] = coor[tar_num][1], coor[i][1]
coor[i][-1] = (direc + j) % 8
else:
field[ny][nx] = field[fy][fx]
field[ny][nx][1] = (direc + j) % 8
field[fy][fx] = 0
coor[i] = [ny, nx, (direc + j) % 8]
break
def shark(y, x, inp, raw_field, raw_coor):
global result
field = deepcopy(raw_field)
coor = deepcopy(raw_coor)
n, direc = field[y][x]
field[y][x] = -1
coor[n] = 0
val = inp + n
move_fish(field, coor)
ny = y + d[direc][0]
nx = x + d[direc][1]
while 0 <= ny < 4 and 0 <= nx < 4:
if field[ny][nx]:
field[y][x] = 0
shark(ny, nx, val, field, coor)
ny += d[direc][0]
nx += d[direc][1]
result = max(result, val)
raw_coor = [0 for i in range(17)]
d = [(-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1)]
raw_field = [[0 for i in range(4)] for j in range(4)]
result = -1
for i in range(4):
lst = list(map(int, input().split()))
for j in range(0, 8, 2):
raw_coor[lst[j]] = [i, j//2, lst[j+1]-1]
raw_field[i][j//2] = [lst[j], lst[j+1]-1]
shark(0, 0, 0, raw_field, raw_coor)
print(result)
댓글남기기