Cometin'

BOJ-7562 - Python

2020-12-10 at Algorithm category

체스 보드의 크기를 입력받은 후 나이트 말의 시작 좌표와 도착 좌표를 입력받는다. 최소 몇 번 말을 움직여야 도착 좌표까지 이동할 수 있는 지 출력하는 문제. 첫 풀이는 queue에 카운트를 넣으며, 2차원 배열은 방문 확인을 위해 사용하여 풀으며 두번째 풀이는 2차원 배열에 움직인 횟수를 저장하여 풀었다. 여러 방법으로 계속해서 풀었으나 틀렸습니다 결과를 받게되었는데 말이 갈 수 있는 방향을 저장해 놓은 배열이 잘못돼 있었다.

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

dire = [[2, -1], # 상 좌
        [2, 1], # 상 우
        [1, 2], # 우 상
        [-1, 2], # 우 하
        [-2, 1], # 하 우
        [-2, -1], # 하 좌
        [1, -2], # 좌 상
        [-1, -2]] # 좌 하


# def bfs(start, goal_y, goal_x):
#     q = deque()
#     q.append(start + [0])
#     while q:
#         now_y, now_x, cnt = q.popleft()
#
#         if now_y == goal_y and now_x == goal_x:
#             return cnt
#
#         for dire_y, dire_x in dire:
#             next_y = now_y + dire_y
#             next_x = now_x + dire_x
#             if 0 <= next_y < size and 0 <= next_x < size:
#                 if not board[next_y][next_x]:
#                     q.append([next_y, next_x, cnt+1])
#                     board[next_y][next_x] = True
# t = int(input())
# for _ in range(t):
#     size = int(input())
#     board = [[False for _ in range(size)] for _ in range(size)]
#     start_y, start_x = map(int, input().split())
#     goal_y, goal_x = map(int, input().split())
#
#     ans = bfs([start_y, start_x], goal_y, goal_x)
#     print(ans)


def bfs(start_y, start_x, goal_y, goal_x):
    q = deque()
    q.append([start_y, start_x])
    board[start_y][start_x] = 1

    while q:
        now_y, now_x = q.popleft()

        if now_y == goal_y and now_x == goal_x:
            return board[now_y][now_x] - 1

        for dire_y, dire_x in dire:
            next_y = now_y + dire_y
            next_x = now_x + dire_x
            if 0 <= next_y < size and 0 <= next_x < size:
                if board[next_y][next_x] == 0:
                    q.append([next_y, next_x])
                    board[next_y][next_x] = board[now_y][now_x] + 1

t = int(input())
for _ in range(t):
    size = int(input())
    board = [[0 for _ in range(size)] for _ in range(size)]
    start_y, start_x = map(int, input().split())
    goal_y, goal_x = map(int, input().split())

    if start_y == goal_y and start_x == goal_x:
        print(0)
        continue

    ans = bfs(start_y, start_x, goal_y, goal_x)
    print(ans)

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.