Algorithm/acmicpc.net

bfs. 방문 기록의 중요성

winney916 2022. 1. 24. 12:16
728x90

#7562번 나이트의 이동 https://www.acmicpc.net/problem/7562

 

7562번: 나이트의 이동

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

www.acmicpc.net

처음에 짠 코드

for _ in range(int(input())):
    N = int(input())
    now = list(map(int, input().split()))
    target = list(map(int, input().split()))

    dr = [1, 2, 1, 2, -1, -2, -1, -2]
    dc = [-2, -1, 2, 1, -2, -1, 2, 1]

    queue = [now]
    cnt = 0
    answer = 0
    while queue and answer == 0:
        tmp = []
        print(cnt)
        for r, c in queue:
            if [r, c] == target:
                answer = cnt
                break

            for i in range(8):
                nr, nc = r+dr[i], c+dc[i]
                if 0 <= nr < N and 0 <= nc < N:
                    print(tmp)
                    tmp.append([nr, nc])
        cnt += 1
        queue = tmp
    print(answer)

무난하게 패스할거라 기대했는데, 진짜 오래걸려서 접었다...

 

뭐가 문제인지 한참 고민하다가 다른 솔루션을 찾았다. (구글링)

 

for _ in range(int(input())):
    N = int(input())
    now = list(map(int, input().split()))
    target = list(map(int, input().split()))
    visited = [[0]*N for _ in range(N)]

    dr = [1, 2, 1, 2, -1, -2, -1, -2]
    dc = [-2, -1, 2, 1, -2, -1, 2, 1]

    queue = [now]
    visited[now[0]][now[1]] = 1
    while queue:
        r, c = queue.pop(0)
        if [r, c] == target:
            # print(r, c)
            print(visited[r][c]-1)
            break

        for i in range(8):
            nr, nc = r+dr[i], c+dc[i]
            if 0 <= nr < N and 0 <= nc < N and visited[nr][nc] == 0:
                queue.append([nr, nc])
                visited[nr][nc] = visited[r][c] + 1

방문기록을 안해줘서 나이트가 무한 뺑뺑이를 돌린게 문제였다...

 

미안...

 

그래프 탐색은 방문기록이 참 중요한듯 하다

뺑치지지말자