7562 :나이트의 이동

서희찬·2021년 10월 17일
0

백준

목록 보기
66/105

문제

코드

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

# 나이트 8가지 케이스 
dx = [1,2,1,2,-1,-1,-2,-2]
dy = [2,1,-2,-1,2,-2,1,-1]

def bfs():
  while queue:
      a,b = queue.popleft() #i.j삽입 
      for i in range(8):
          cx = a+dx[i]
          cy = b+dy[i]
          if 0<=cx<n  and 0<=cy<n and graph[cx][cy]==0: #아직한번도 안간곳
              graph[cx][cy] = graph[a][b] + 1 #칸수 더해나감 
              queue.append([cx,cy])

test = int(input())
for _ in range(test):

    # 덱선언
    queue = deque()

    n = int(input())
    graph = [[0] * n for _ in range(n)] #그래프 생성

    knight_x, knight_y = map(int,input().split()) #나이트 x,y값 
    dochak_x, dochak_y = map(int,input().split())

    queue.append([knight_x,knight_y])
    bfs()
    graph[knight_x][knight_y]=0
    print(graph[dochak_x][dochak_y])

해설

아씌,, 다 적었는데 ㄴ날라갔다.
두번적는거니깐 핵심만 적겠다..

BFS를 돌면서 원하는 자리에 까지가는 시간을 찾는것이랑 똑같아서 또마토 문제랑 똑같다고 생각하면된다.
대신 내가 원하는 출발자리와 원하는 끝날 자리가 있다는것이다.
python으로 돌렸을때 시간초과가 떳는데 이는 내가 원하는 케이스를 구했어도 계속돌아서 그런것같다.
pypy로 시간초과문제는 해결했다.
중요한 부분은 나이트의 방향벡터를

# 나이트 8가지 케이스 
dx = [1,2,1,2,-1,-1,-2,-2]
dy = [2,1,-2,-1,2,-2,1,-1]

이와같이 잡아줘서 포문을 도는것이다.

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글