문제 : https://www.acmicpc.net/problem/17837
처음에 deque을 사용하여 구현했는데 실패함.. 시간초과가 뜨는게 아니라 아예 예제 테스트케이스부터 실패하길래 뭐지? 하고 리스트 슬라이싱을 사용해서 풀었는데 또 실패.. 5일 걸려서 붙잡고 있었는데도 문제가 뭔지 전혀 캐치를 못했는데 문제는 바로 다음 칸이 blue 인 경우에 있었음
다음 으로 이동하는 칸이 blue인 경우에는 방향을 바꾸어 한칸 진행함. 이때 새롭게 도착한 곳이 red라면 순서를 바꾸어서 쌓아야하는데 그것을 구현 안해서 자꾸 에러가 났던것.ㅠ
n,k=map(int, input().split())
color=[list(map(int ,input().split())) for i in range(n)]
mal=[]
for i in range(k):
x,y,d=map(int ,input().split())
mal.append([x-1,y-1,d-1])
graph=[[[] for i in range(n)] for j in range(n)]
for i in range(k):
graph[mal[i][0]][mal[i][1]].append(i)
movelist=[[0,1],[0,-1],[-1,0],[1,0]]
turn=0
while True:
turn+=1
for i in range(k):
ci,cj,cd=mal[i][0],mal[i][1],mal[i][2]
ni,nj=ci+movelist[cd][0],cj+movelist[cd][1]
# 블루
if (not 0<=ni<n) or (not 0<=nj<n) or color[ni][nj]==2:
if cd%2==1:
cd-=1
else:
cd+=1
mal[i][2]=cd
ni,nj=ci+movelist[cd][0],cj+movelist[cd][1]
if (not 0<=ni<n) or (not 0<=nj<n) or color[ni][nj]==2:
continue
else:
if color[ni][nj]==0:
for j in range(len(graph[ci][cj])):
if graph[ci][cj][j]==i:
for t in range(j,len(graph[ci][cj])):
mal[graph[ci][cj][t]][0],mal[graph[ci][cj][t]][1]=ni,nj
graph[ni][nj]+=graph[ci][cj][j:]
graph[ci][cj]=graph[ci][cj][:j]
break
else:
for j in range(len(graph[ci][cj])):
if graph[ci][cj][j]==i:
for t in range(j,len(graph[ci][cj])):
mal[graph[ci][cj][t]][0],mal[graph[ci][cj][t]][1]=ni,nj
tempgraph=graph[ci][cj][j:]
tempgraph.reverse()
graph[ni][nj]+=tempgraph
graph[ci][cj]=graph[ci][cj][:j]
break
#red
elif color[ni][nj]==1:
for j in range(len(graph[ci][cj])):
if graph[ci][cj][j]==i:
for t in range(j,len(graph[ci][cj])):
mal[graph[ci][cj][t]][0],mal[graph[ci][cj][t]][1]=ni,nj
tempgraph=graph[ci][cj][j:]
tempgraph.reverse()
graph[ni][nj]+=tempgraph
graph[ci][cj]=graph[ci][cj][:j]
break
# white
elif color[ni][nj]==0:
for j in range(len(graph[ci][cj])):
if graph[ci][cj][j]==i:
for t in range(j,len(graph[ci][cj])):
mal[graph[ci][cj][t]][0],mal[graph[ci][cj][t]][1]=ni,nj
tempgraph=graph[ci][cj][j:]
graph[ni][nj]+=tempgraph
graph[ci][cj]=graph[ci][cj][:j]
break
if len(graph[ni][nj])>=4:
print(turn)
exit()
if turn>1000:
print(-1)
exit()
0에서 1이 바로 되는것이 아님.
0.0000000000...1부터 0.999999999... 까지 거쳐야 비로소 1이 되는것.