BAEKJOON-7562-나이트의 이동

이동규·2020년 11월 17일
0

메모이제이션과 너비우선탐색을 이용하여 완전탐색을 한 뒤 체스의 나이트의 현재 지점에서 목표 지점까지 가는 최소 이동 횟수를 구함



from collections import deque

dx, dy = [2, 1, -1, -2, -2, -1, 1, 2], [1, 2, 2, 1, -1, -2, -2, -1]  # 델타검색, 한 지점을 기준으로 말이 갈 수 있는 좌표를 이용 할 것임

def bfs():
    queue = deque()  # 속도를 위해 덱 사용하여 큐 구현
    queue.append([start_row, start_col])

    while queue:
        r, c = queue.popleft()
        for i in range(8):  # 현재 지점에서 갈수 있는 좌표 8군데를 뽑아 보고
            dr, dc = r + dx[i], c + dy[i]
            if 0 <= dr < n and 0 <= dc < n and memo[dr][dc] > memo[r][c] + 1:  # 이 좌표가 행렬 범위 안에 있고 여태까지 메모에 기록 된 최단거리보다 더 단시간에 갈수 있으면
                memo[dr][dc] = memo[r][c] + 1  # 메모에 새로운 기록을 하고
                queue.append([dr, dc])  # 해당 좌표를 큐에 추가하여 순서가 되면 해당 좌표를 기준으로 검색함

for T in range(1, int(input())+1):  # 문제에서 주어진 테스트 케이스 만큼 반복
    n = int(input())  # 정사각형 모양 행렬의 한쪽 길이
    memo = [[1000000 for _ in range(n)] for _ in range(n)]  # 메모이제이션을 사용하기 위한 행렬을 생성
    start_row, start_col = list(map(int, input().split()))  # 시작 지점 좌표 정보
    target_row, target_col = list(map(int, input().split()))  # 도착 지점 좌표 정보
    memo[start_row][start_row] = 0
    bfs()  # 메모이제이션을 사용한 BFS 탐색
    print(memo[target_row][target_col])

0개의 댓글