For Programmer
백준 5105번 파이썬 문제풀이(미로의 거리) - BFS, DFS 본문
728x90
간단한 BFS 구현이다. Visited 리스트를 따로 만들어 해당 위치에서 도착지까지 얼마나 걸리는지 계속해서 확인해면서 가도록 구현했다. 단 DFS의 다양한 방법으로도 구현해 보았다. 모든 코드를 제시 하겠다.
1.BFS
import sys
from collections import deque
sys.stdin = open('input.txt', 'r')
def bfs(start):
queue = deque([start])
visited = [[0] * N for _ in range(N)]
visited[start[0]][start[1]] = 1
dr = [-1, 0, 1, 0] # 상우하좌
dc = [0, 1, 0, -1] # 상우하좌
while queue:
r, c = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
if nc < 0 or nc >= N or nr < 0 or nr >= N or array[nr][nc] == 1:
continue
if array[nr][nc] == 3:
visited[nr][nc] = visited[r][c] + 1
print(visited)
return visited[nr][nc] - 2
elif not visited[nr][nc]:
visited[nr][nc] = (visited[r][c] + 1)
queue.append((nr, nc))
return 0
T = int(input())
for order in range(1, T + 1):
N = int(input())
array = []
start = (-1, -1)
for i in range(N):
temp = list(map(int, input()))
for j in range(len(temp)):
if temp[j] == 2:
start = (i, j)
break
array.append(temp)
print(f'#{order} {bfs(start)}')
2. DFS
import sys
sys.stdin = open('input.txt', 'r')
def dfs(r, c, count):
global min_
if r < 0 or r >= N or c < 0 or c >= N or array[r][c] == 1:
return
#가지치기
if count > min_: #만약 횟수가 이미 저장된 최솟값보다 크다면 리턴
return
#기저
if array[r][c] == 3:
if min_ > count:
min_ = count
return
else:
array[r][c] = 1
#재귀
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
dfs(nr, nc, count + 1)
array[r][c] = 0
T = int(input())
dr = [-1, 0, 1, 0] # 상우하좌
dc = [0, 1, 0, -1] # 상우하좌
for order in range(1, T + 1):
N = int(input())
array = []
start = (-1, -1)
min_ = 1 << 20
for i in range(N):
temp = list(map(int, input()))
for j in range(len(temp)):
if temp[j] == 2:
start = (i, j)
break
array.append(temp)
dfs(start[0], start[1], 1)
if min_ >= 1 << 20:
min_ = 2
print(f'#{order} {min_ - 2}')
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 2592번 파이썬 문제풀이(대표값) (0) | 2022.02.25 |
---|---|
백준 2023번 파이썬 문제풀이(신기한 소수) (0) | 2022.02.25 |
백준 1941번 파이썬 문제풀이(소문난 칠공주) (0) | 2022.02.24 |
백준 9663번 파이썬 문제풀이(N-Queen) (0) | 2022.02.24 |
백준 2239번 파이썬 문제풀이(스도쿠) (0) | 2022.02.24 |
Comments