19237 어른 상어

이광훈·2023년 11월 4일
# 08 10
import sys
import copy
input = sys.stdin.readline

n , m , k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
smell_board = [[[0 , 0] for _ in range(n)] for _ in range(n)]
currentDirection = [0] + list(map(int, input().split())) # 상어의 현재 방향
dirRank = [[[0] , [0] , [0] , [0] , [0]] for _ in range(m + 1)]
sharkPos = [[0 , 0] for _ in range(m + 1)] # 나가면 sharkPos 에 -1 , -1 기록


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

for i in range(1 , m + 1):
    for j in range(1 , 5):
        dirRank[i][j] = [0] + list(map(int, input().split()))

for i in range(n):
    for j in range(n):
        if board[i][j] > 0:
            sharkPos[board[i][j]] = [i , j]

round = 0
curMaxShark = m

for i in range(1 , m + 1):
    smell_board[sharkPos[i][0]][sharkPos[i][1]] = [i , k]

def getDirection(shark_num , curY , curX):

    for i in range(1 , 5):
        
        ny = curY + dy[dirRank[shark_num][currentDirection[shark_num]][i]]
        nx = curX + dx[dirRank[shark_num][currentDirection[shark_num]][i]]

        if nx < 0 or ny < 0 or nx > n - 1 or ny > n - 1:
            continue

        if smell_board[ny][nx][1] == 0:
            currentDirection[shark_num] = dirRank[shark_num][currentDirection[shark_num]][i]
            return [ny , nx]
        
    else:

        for i in range(1 , 5):
        
            ny = curY + dy[dirRank[shark_num][currentDirection[shark_num]][i]]
            nx = curX + dx[dirRank[shark_num][currentDirection[shark_num]][i]]

            if nx < 0 or ny < 0 or nx > n - 1 or ny > n - 1:
                continue

            if smell_board[ny][nx][0] == shark_num:
                currentDirection[shark_num] = dirRank[shark_num][currentDirection[shark_num]][i]
                return [ny , nx]

while True:

    next_round_board = [[0] * n for _ in range(n)]

    for i in range(1 , m + 1):

        if sharkPos[i][0] == -1 and sharkPos[i][1] == -1:
            continue
        
        [ny , nx] = getDirection(i , sharkPos[i][0] , sharkPos[i][1]) # 방향 정하고

        if next_round_board[ny][nx] == 0: # 해당 칸이 빈 칸이면
            next_round_board[ny][nx] = i # 기록
            sharkPos[i][0] , sharkPos[i][1] = ny , nx

        elif 0 < next_round_board[ny][nx] < i: # 나보다 작은 상어가 다음 칸에 있으면
            sharkPos[i][0] , sharkPos[i][1] = -1 , -1 # 해당 상어 내쫓음
        
        ## 여기까지 이동 구현

    for i in range(n):
        for j in range(n):

            if smell_board[i][j][0] > 0:
                smell_board[i][j][1] -= 1

                if smell_board[i][j][1] == 0:
                    smell_board[i][j][0] = 0
    
    for i in range(1 , m + 1):

        if sharkPos[i][0] != -1:
            smell_board[sharkPos[i][0]][sharkPos[i][1]] = [i , k]

    round += 1
    finished = 1

    if round > 1000:
        print(-1)
        break
    
    # print(currentDirection)
    # print(next_round_board)
    # print(smell_board)


    for i in range(n):
        for j in range(n):
            if next_round_board[i][j] > 1:
                finished = 0
                
    if finished:
        print(round)
        break
  • 빡세다 빡세 구현 ㄷㄷ
profile
허허,,,

0개의 댓글