백준/BFS

[파이썬]-백준(BOJ)7562_ 나이트의 이동

Ho's log 2021. 4. 21. 15:34

나이트의 이동 성공출처다국어분류

한국어    

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 256 MB 24238 11576 8697 47.049%

문제

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

입력

입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

출력

각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

 

해설

문제를 풀때 처음에 dfs로  풀고자 하였지만  호출깊이가 너무 많아서 시간초과가 났다. 

그래서 바꾼 풀이가 bfs 로 판의 갯수를 다 초기화 해주는 것이다.

예제 입력 1 복사

3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# # 나이트의 이동
# # 시간 제한    메모리 제한    제출    정답    맞은 사람    정답 비율
# # 1 초    256 MB    24097    11503    8649    47.059%
# # 문제
# # 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
# #
# #
# #
# # 입력
# # 입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
# #
# # 각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
# #
# # 출력
# # 각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
#
# # 나이트의 이동가능 경로
#
# # 깊이가 너무 깊어 bfs 로 풀어야 한다 .
# import sys
#
#
#
#
# def dfs(l, x, y):
#     if x[0] < 0 and x[1] < 0:
#         return
#     if x[0] >= l and x[1] >= l:
#         return
#     if (x[0] - y[0]) == 0 and (x[1] - y[1]) == 0:
#         return
#     for index in range(8):
#         dfs(l, [x[0] + dx[index], x[1] + dy[index]], y)
#         counts += 1
#
#
# def solution(l, x, y):
#     # 가장 작은값 찾기;
#     answerlist = []
#     global counts
#
#     counts = 0
#
#     dfs(l, x, y)
#
#     return counts
#
from collections import deque
 
dx = [-2-112-2-112]
dy = [-1-2-2-11221]
 
 
def solution(l, x, y):
    # print(x, y)
    # 일단 bfs 로 돌면서 각 최소값들을 체크해서 판을 모두 채우자
    # 그러면 방문한 곳은 0 이 아닌 만들어 주자
 
    # 일단 판을 만들고
    gamMap = [[-1* l for i in range(l)]
 
    # for index in gamMap:
    #     for element in range(l):
    #         index.append(-1)
 
    # 게임 맵이 -1 이 아니면
    # bfs 수행
    queue = deque()
    # 시작점 넣기
    queue.append(x)
    # 시작 점 방문 처리
    gamMap[x[0]][x[1]] = 0
    # print(queue)
    # 이동 횟수
    cnt = 0
    move = 0
    tempmove = 0
    # bfs
    while queue[0!= y:
        # 큐에서 지금 위치 꺼내기
        location = queue.popleft()
 
        for index in range(8):
            # 게임판 을 벗어나는지 체크하기
            if 0 <= location[0+ dy[index] < l and 0 <= location[1+ dx[index] < l:
                # 만약에 방문이 안된곳이라면
                if gamMap[location[0+ dy[index]][location[1+ dx[index]] == -1:
                    # 큐에 없고
                    # --> not in 연산 시간이 오래 걸려서 시간 초과
                    # if [location[0] + dy[index], location[1] + dx[index]] not in queue:
                        # 이동 횟수로 바꿔주고 -> 이동 횟수가 아닌 바로 전꺼를 더해주자!
                        gamMap[location[0+ dy[index]][location[1+ dx[index]] = gamMap[location[0]][location[1]] + 1
                        # 큐에 추가 해줍니다.
                        queue.append([location[0+ dy[index], location[1+ dx[index]])
        # print(queue)
 
    # print(*gamMap)
    print(gamMap[y[0]][y[1]])
 
 
if __name__ == '__main__':
 
    n = int(input())
    array = []
 
    for _ in range(n):
        l = int(input())
 
        x = list(map(int, input().split()))
        y = list(map(int, input().split()))
        array.append([l, x, y])
 
        pass
    for i in array:
        solution(i[0], i[1], i[2])
 
cs