https://www.acmicpc.net/problem/17837
"""
"""
from sys import stdin
input = stdin.readline
n, k = map(int, input().split()) # n : 체스판의 크기, k : 말의 개수
pan = [ list(map(int, input().split())) for _ in range(n) ] # 체스판 - 0 : 흰색, 1 : 빨간색, 2 : 파란색
chess = [ [[] for _ in range(n)] for _ in range(n) ]
dx, dy = [0, 0, -1, 1], [1, -1, 0, 0]
horse = []
for i in range(k):
r, c, d = map(int, input().split())
horse.append([r-1, c-1, d-1])
chess[r-1][c-1].append(i)
turn = 0
def solve(horse_num):
x, y, dir = horse[horse_num]
mx = x + dx[dir]
my = y + dy[dir]
if not (0 <= mx < n and 0 <= my < n) or pan[mx][my] == 2:
if dir in (0, 2):
dir += 1
else:
dir -= 1
horse[horse_num][2] = dir
mx = x + dx[dir]
my = y + dy[dir]
if not (0 <= mx < n and 0 <= my < n) or pan[mx][my] == 2:
return True # 방향을 돌렸는데도 범위를 벗어나거나 다시 파란색을 만났으면 이번 horse_num의 말은 차례가 끝났다는 말로 True를 return
horse_add = [] # 옮길 말의 정보를 담는 리스트
for idx, number in enumerate(chess[x][y]): # 인덱스를 이용해서 옮길 말을 정함
if number == horse_num:
horse_add.extend(chess[x][y][idx:])
chess[x][y] = chess[x][y][:idx]
break
if pan[mx][my] == 1: # 빨간색을 만나면 옮길 말을 뒤집기
horse_add.reverse()
for h in horse_add: # 나머지 경우는 그냥 옮기면 됨
horse[h][0], horse[h][1] = mx, my # 말의 정보를 담은 리스트에 정보 업데이트
chess[mx][my].append(h) # 말 이동(쌓아 올리기)
if len(chess[mx][my]) >= 4: # 말이 4개 이상 쌓이면 게임 종료를 알리는 False 리턴
return False
return True # 말이 4개 이상 안쌓였으면 계속 게임을 진행하는 True 리턴
while True:
flag = False
if turn > 1000: # 턴이 1000회가 넘으면 -1 출력
print(-1)
break
for l in range(k): # 말의 번호를 인자로 넘겨줌
if solve(l) == False:
flag = True
break
turn += 1
if flag == True:
print(turn)
break
너무 어려워서 참고 자료 많이 참고..