chldkato

백준 17780 새로운 게임 (파이썬) 본문

백준

백준 17780 새로운 게임 (파이썬)

chldkato 2020. 3. 6. 11:52

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

 

17780번: 새로운 게임

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

www.acmicpc.net

1. chess_map에는 체스말을 번호를 쌓인 순으로 저장하고 chess에는 말의 좌표와 방향을 저장한다

2. 말의 번호를 순서대로 move에 입력하여 이동한다

3. 입력받은 말의 번호와 말이 있는 좌표의 맨 밑에 있는 말이 번호가 다르면 return 한다

4. 다음 칸이 2이거나 범위 밖인 경우를 먼저 처리한다

   방향을 전환해도 2이거나 범위 밖이면 return 한다

5. chess_set에 이동할 체스 묶음을 저장하고 chess_map의 해당 좌표를 초기화한다

6. chess_set에 있는 말들을 다음 칸으로 이동하고 말의 좌표를 갱신한다

7. 쌓인 말의 개수가 4 이상이면 1을 리턴하고 cnt를 출력한다

import sys

input = sys.stdin.readline
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def move(chess_num):
    x, y, z = chess[chess_num]
    if chess_num != chess_map[x][y][0]:
        return 0

    nx = x + dx[z]
    ny = y + dy[z]

    if not 0 <= nx < n or not 0 <= ny < n or a[nx][ny] == 2:
        if 0 <= z <= 1:
            nz = (z+1) % 2
        else:
            nz = (z-1) % 2 + 2
        chess[chess_num][2] = nz
        nx = x + dx[nz]
        ny = y + dy[nz]
        if not 0 <= nx < n or not 0 <= ny < n or a[nx][ny] == 2:
            return 0

    chess_set = []
    chess_set.extend(chess_map[x][y])
    chess_map[x][y] = []

    if a[nx][ny] == 1:
        chess_set = chess_set[-1::-1]

    for i in chess_set:
        chess_map[nx][ny].append(i)
        chess[i][:2] = [nx, ny]

    if len(chess_map[nx][ny]) >= 4:
        return 1
    return 0

n, k = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
chess_map = [[[] for _ in range(n)] for _ in range(n)]
chess = [0 for _ in range(k)]

for i in range(k):
    x, y, z = map(int, input().split())
    chess_map[x-1][y-1].append(i)
    chess[i] = [x-1, y-1, z-1]

cnt = 1
while cnt <= 1000:
    for i in range(k):
        flag = move(i)
        if flag:
            print(cnt)
            sys.exit()
    cnt += 1
print(-1)

Comments