백준 구현 대비 새로운게임2

yjkim·2023년 8월 6일
0

알고리즘

목록 보기
37/60

문제 : 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이 되는것.

profile
We may throw the dice, but the Lord determines how they fall

0개의 댓글