[Python] 백준 17837번: 새로운 게임 2
알고리즘/[Python] 백준

[Python] 백준 17837번: 새로운 게임 2

출처 : https://www.acmicpc.net/problem/17837

 

17837번: 새로운 게임 2

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하나의 말 위에 다른 말을 올릴 수 있다. 체스판의 각 칸은 흰색, 빨간색, 파란색 중 하나로 색칠되어있다. 게임은 체스판 위에 말 K개를 놓고 시작한다. 말은 1번부터 K번까지 번호가 매겨져 있고, 이동 방향도 미리 정해져 있다. 이동 방향은 위, 아래, 왼쪽, 오른쪽

www.acmicpc.net

 


# 정리

k개의 말을 입력받는다.

각 말들을 1번부터 k번 말까지 순서대로 주어진 규칙에 따라 이동시킨다.

 

 

값이 리턴되는 경우의 수는 2가지이다.

1. 이동하려는 칸에 존재하는 체스말이 4개이상인 경우 → turn 횟수를 리턴한다.

2. turn 횟수가 1000을 넘기는 경우 → -1을 리턴한다.

 

이를 만족시킬 수 있을때까지 반복하면 된다.

 


# Code

def solve():
    turn = 0
    P = 0
    while True:
        turn += 1
        if turn > 1000return -1
        for number in range(1, k+1):
            x, y, d = horse[number]
            nx, ny = x+dx[d], y+dy[d]
            ## 맵을 벗어나는 경우 or 이동하려는 칸이 파란색인 경우
            if nx<0 or nx>=or ny<0 or ny>=or board[nx][ny] == Blue:
                nd = rev_direction[d]
                nx, ny = x+dx[nd], y+dy[nd]
                ## 가만히 있는 경우(방향만 바뀐다.)
                if nx<0 or nx>=or ny<0 or ny>=or board[nx][ny] == Blue:
                    horse[number][2= nd
                    continue
                P = 1
            ## 이동하려는 칸이 흰색인 경우
            if board[nx][ny] == White:
                left = board_2[(x, y)][:board_2[(x, y)].index(number)]
                right = board_2[(x, y)][board_2[(x, y)].index(number):]
                board_2[(x, y)] = left
                board_2[(nx, ny)].extend(right)
                if len(board_2[(nx, ny)]) >= 4return turn
                for i in right:
                    horse[i][0], horse[i][1= nx, ny
                if P==1: horse[number][2= nd; P=0
            ## 이동하려는 칸이 빨간색인 경우
            elif board[nx][ny] == Red:
                left = board_2[(x, y)][:board_2[(x, y)].index(number)]
                right = board_2[(x, y)][board_2[(x, y)].index(number):]
                board_2[(x, y)] = left
                right.reverse()
                board_2[(nx, ny)].extend(right)
                if len(board_2[(nx, ny)]) >= 4return turn
                for i in right:
                    horse[i][0], horse[i][1= nx, ny
                if P==1: horse[number][2= nd; P=0
 
                    
if __name__ == '__main__':
    n, k = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(n)]
 
    horse = dict()
    board_2 = {(i, j):[] for j in range(n) for i in range(n)}
 
    for i in range(1, k+1):
        x, y, d = map(int, input().split())
        horse[i] = [x-1, y-1, d-1]
        board_2[(x-1, y-1)].append(i)
 
    White = 0
    Red = 1
    Blue = 2
 
    # 동, 서, 북, 남
    dx = (00-11)
    dy = (1-100)
 
    rev_direction = {0:11:02:33:2}
    print(solve())
cs