백준 17780번 새로운 게임 (Python 3)

2022. 9. 1. 18:23Problem solving

Baekjoon online judge 17780번 파이썬

 

링크

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

 

17780번: 새로운 게임

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하

www.acmicpc.net

구현문제

소스코드

import sys
from collections import deque
input = sys.stdin.readline

n,k=map(int,input().split())
map_data=[list(map(int,input().split())) for _ in range(n)]
piece_map=[[deque() for _ in range(n)] for _ in range(n)]

piece=list()

for i in range(k):
  y,x,d=map(int,input().split())
  piece.append([y-1,x-1,d])
  piece_map[y-1][x-1].append(i)


index=[[],[1,0],[-1,0],[0,-1],[0,1]]

max_height=0 #병합이 일어날때 갱신
turn=0

def update(before,after):
  global piece_map
  global piece
  y,x=before
  ny,nx=after
  for p in piece_map[y][x]:
    oy,ox,od=piece[p]
    piece[p]=[ny,nx,od]
  #piece_map[y][x]=deque()

def move(num):
  global piece
  global piece_map
  global max_height
  y,x,d=piece[num]

  if len(piece_map[y][x])>=2 and piece_map[y][x][0]!=num:
    return False
  else:
    nx=x+index[d][0]
    ny=y+index[d][1]

    if not (0<=nx<n and 0<=ny<n) or map_data[ny][nx]==2:
      if d==1:
        d=2
      elif d==2:
        d=1
      elif d==3:
        d=4
      elif d==4:
        d=3
      nx=x+index[d][0]
      ny=y+index[d][1]
      piece[num] = [y, x, d]

      if not (0<=nx<n and 0<=ny<n) or map_data[ny][nx]==2:
        #update([y,x],[y,x,d]) # piece_map에서 각 piece에 접근해서 데이터수정

        return True

    if map_data[ny][nx]==1:
      piece_map[y][x].reverse()
      piece_map[ny][nx].extend(piece_map[y][x])
      max_height=max(max_height,len(piece_map[ny][nx]))
      update([y,x],[ny,nx])
      piece_map[y][x] = deque()
      return True

    elif map_data[ny][nx]==0:
      piece_map[ny][nx].extend(piece_map[y][x])
      max_height = max(max_height, len(piece_map[ny][nx]))
      update([y,x],[ny,nx])
      piece_map[y][x] = deque()
      return True

while max_height<4 and turn<=1000:
  turn+=1
  for i in range(k):
    move(i)
    #print(piece_map)
    #print(piece)


if turn>1000:
  print(-1)
else:
  print(turn)