Algorithm/SW Expert Academy

[Python] 5105. 미로의 거리

느낌표 공장장 2021. 9. 23. 23:10
# 방향 벡터 / 상, 하, 좌, 우
dy = [1, -1, 0, 0]
dx = [0, 0, -1, 1]

# 미로탈출 bfs(시작 y좌표, 시작 x 좌표) -> 2의 위치
def bfs(sy, sx):
    q = [(sy, sx)]  # q에 시작 좌표 넣어주고 시작

    # q가 빌때까지 반복
    while q:
        now_y, now_x = q.pop(0) # 현재 좌표 q에서 가져오기 (bfs니까 맨앞에꺼)
        # 상하좌우 탐색
        for i in range(4):
            # 이동해볼 좌표 설정 (현재 위치 + 방향 벡터가 가리키는 곳)
            next_y = now_y + dy[i]
            next_x = now_x + dx[i]

            # 이동해볼 곳이 미로 범위 안에 있다 ?
            if 0 <= next_y < n and 0 <= next_x < n:
                # 그리고 거기가 방문하지 않았던 곳이고, 통로('0')이다?
                if not visited[next_y][next_x] and maze[next_y][next_x] == '0':
                    q.append((next_y, next_x))      # 그렇담 가보자 q에 넣어놔
                    visited[next_y][next_x] = visited[now_y][now_x] + 1  # 이동해볼 곳이 출발 한 곳으로부터 통로를 몇개나 이동했는지 표시

                # 이동해볼 곳이 출구다 ??????
                elif maze[next_y][next_x] == '3':
                    return visited[now_y][now_x]   # 현재까지 통로 지난 횟수(몇 칸 지나왔는지) 반환 (3까지 거리 X, 0 지난 횟수 O)

    # q 비었는데 출구 못찾았나요? -> 경로 없음
    return 0
    

tc = int(input())

for idx in range(1, tc+1):
    n = int(input())

    sy = sx = -1    # 시작점 좌표 (sy 행, sx 열)
    maze = []
    for i in range(n):
        maze.append(input())
        # 시작점 좌표 찾기
        # (-1은 2찾은 경우는 and 뒤의 조건 만족하는지 탐색 안하기 위함)
        if sy == -1 and '2' in maze[i]:
            sy = i
            sx = maze[i].find('2')

    # 방문 리스트 & 통로 지난 횟수 계산 리스트
    visited = [[0 for _ in range(n)] for _ in range(n)]

    print('#{} {}'.format(idx, bfs(sy, sx)))

    # visited 출력해서 한눈에 보기
    for i in range(n):
        print(*visited[i])

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 1232. 사칙연산  (0) 2021.09.24
[Python] 1231. 중위 순회  (0) 2021.09.23
[Python] 5102. 노드의 거리  (0) 2021.09.23
[Python] 5099. 피자굽기  (0) 2021.09.23
[Python] 1226. 미로1  (0) 2021.09.23