Algorithm/SW Expert Academy

[Python] 1226. 미로1

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

# 미로탈출 bfs(시작 y좌표, 시작 x 좌표) -> 2의 위치
def bfs(sy, sx):
    visited[sy][sx] = 1
    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 < 16 and 0 <= next_x < 16:
                # 그리고 거기가 방문하지 않았던 곳이고, 통로('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] = 1  # 이동해볼 곳이 출발로부터 통로를 몇개나 이동했는지 표시

                # 이동해볼 곳이 출구다 ??????
                elif maze[next_y][next_x] == '3': return 1

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


for _ in range(1, 11):
    n = int(input())

    sy = sx = -1    # 시작점 좌표 (sy 행, sx 열)
    maze = []
    for i in range(16):
        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(16)] for _ in range(16)]

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

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

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

[Python] 5102. 노드의 거리  (0) 2021.09.23
[Python] 5099. 피자굽기  (0) 2021.09.23
[Python] 1225. 암호생성기  (0) 2021.09.23
[Python] 4881. 배열 최소합  (0) 2021.09.21
[Python] 4880. 토너먼트 카드 게임  (0) 2021.09.21