boj 19237 어른상어(골드2)

김준오·2022년 4월 29일
0

알고리즘

목록 보기
89/91
post-thumbnail

문제

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

내풀이

n, m, k = map(int,input().split())

arr = [list(map(int,input().split())) for _ in range(n)]
shark_move_info = {}
shark_loc = {}
shark_direction = list(map(int,input().split()))
shark_loc_info = []   ## [[[y,x],num, dir], ~, ~] 1,2,3,4.. 순서대로
temp = {}
for i in range(n):
    for j in range(n):
        if arr[i][j] > 0:
            shark_loc[arr[i][j]] = [[i, j]]

for i in range(len(shark_direction)):
    shark_loc[i+1].append(i+1)
    shark_loc[i+1].append(shark_direction[i])

for i in range(1,m+1):
    shark_loc_info.append(shark_loc[i])

dy = [0,-1,1,0,0]
dx = [0,0,0,-1,1]

for num in range(1,m+1):
    shark_move_info[num] = []
    for _ in range(4):
        shark_move_info[num].append(list(map(int,input().split())))

time = 0

arr = [[[0, 0, 0, 0]] * n for _ in range(n)]  #shark_num,냄새주인,남은 지속시간, dir

def print_map():
    for i in range(n):
        for j in range(n):
            print(arr[i][j], end=' ')
        print()
    print()

## 초기 상태 셋팅
for i in range(len(shark_loc_info)):
    (y, x), num, dir = shark_loc_info[i]
    arr[y][x] = [num, num, k, dir]

shark_loc_info.reverse()   ## 4,3,2,1 순서로 뒤집기 ( 덮어쓰기위해)


def smell_decrease():
    for i in range(n):
        for j in range(n):
            a,b,c,d = arr[i][j]
            if c >= 2:
                arr[i][j] = [a,b,c-1,d]

            elif c == 1:
                arr[i][j] = [a,0,0,d]

def check_next_dir(y,x, num, current_dir) -> int:
    dir_order = shark_move_info[num][current_dir-1]
    for k in dir_order:
        ny, nx = y + dy[k], x + dx[k]
        if ny < 0 or ny >= n or nx < 0 or nx >= n: continue
        if arr[ny][nx][2] == 0:
            return k

    for k in dir_order:
        ny, nx = y+dy[k], x + dx[k]
        if ny < 0 or ny >= n or nx < 0 or nx >= n : continue
        if arr[ny][nx][1] == num:
            return k

def move_shark():
    global shark_loc_info
    global arr
    temp = {}
    temp2 = []
    arr2 = [arr[i][:] for i in range(len(arr))]

    for i in range(len(shark_loc_info)):
        cord, num, dir = shark_loc_info[i]
        y,x = cord[0], cord[1]
        next_dir = check_next_dir(y, x, num, dir)  # 1~4
        ny, nx = y + dy[next_dir], x + dx[next_dir]
        arr2[ny][nx] = [num, num, k+1, next_dir]

        a, b, c, d = arr[y][x]
        arr2[y][x] = [0, b, c, 0]
        temp[(ny, nx)] = [num, next_dir]


    arr = [arr2[i][:] for i in range(len(arr2))]
    for key, v in temp.items():
        temp2.append([[key[0], key[1]], v[0], v[1]])    ## [[y,x] , num, dir]
    shark_loc_info = temp2
    shark_loc_info.sort(key = lambda x:-x[1])

time = 1

while(time < 1001):
    move_shark()
    smell_decrease()
    if len(shark_loc_info) == 1:
        break
    time += 1

print(-1) if time > 1000 else print(time)
profile
jooooon

0개의 댓글

관련 채용 정보