입력 : 5-4-1-9-7-3-8-2-6
출력 : 6-2-8-3-7-9-1-4-5
def recursive(i):
if i == 100:
return
print(f'재귀 함수 {i}번 실행')
recursive(i+1)
recursive(1)
1.탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
2.스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리를 한다 , 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
3.2번 과정을 수행할 수 없을 떄까지 반복합니다.(재귀함수)
# DFS 는 매서드를 항상 정의 해야 한다.
# DFS 의 기본은 재귀함수를 통해 만든다.
# graph = 연결되어 있는 그래프의 정보
# v = 현재 그래프의 위치
# visited = 방문 여부
def dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]: #graph 별로 데이터 를
dfs(graph, i, visited)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
dfs(graph, 1, visited)
n, m = map(int, input().split()) # 아이스크림 틀의 크기
graph = [list(input()) for _ in range(n)] # 전체 아이스크림 틀에 그래피
visited = [[False] * m for _ in range(n)] # 해당 블록을 방문 했는지 확인하기 위해 방문
dx = [-1, 0, 1, 0] # x 좌표를 이동
dy = dx[::-1] # y좌표의 이동
def dfs(x, y):
visited[x][y] = True # 해당 노드를 방문
for i in range(4): # 상하좌우의 idx 를 탐색
nx = x + dx[i]
ny = y + dy[i]
# 아이스크림 노드를 이동시킬수 있는 조건
# 1. nx,ny 가 아이스크림 틀 안에 있어야함
# 2. nx,ny 좌표가 == 0
# 3. 한번도 방문하지 않은 0 이어야 함
if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == '0' and not visited[nx][ny]:
dfs(nx, ny)
count = 0
for i in range(n):
for j in range(m):
if graph[i][j] == '0' and not visited[i][j]: # 빈 틀(0) 과 방문하지 않은 틀
print(i, j)
dfs(i, j)
count += 1
print(count)
1.탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
2.큐에서 노드를 꺼낸뒤에 해당 노드와 인접한 노드중 방문하지 않는 노드를 모든 큐에 삽입하고 방문 처리를 한다.
3.더 이상 2번 과정이 수행할수 없을떄까지 반복 처리를 한다.
from collections import deque
def bfs(graph, start, visited):
# 덱을 만들어서 초기값을 지정
queue = deque([start])
# 현재 노드를 방문 처리
visited[start] = True
# 큐가 끝날떄까지 반복
while queue:
q = queue.popleft()
print(q, end=' ')
for i in graph[q]:
if not visited[i]:
queue.append(i) # queue 가 지속 되어야 하기 때문에 추가를 반드시 해주어야 한다.
visited[i] = True # 계속해서 방문 을 체크해준다.
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
bfs(graph, 1, visited)
미로 탈출 의 시작은 (0,0) 에서 시작하여 마지막 (n-1, m-1) 로 이동을 해야한다.
만약 (i,j) 로 이동을 한다고 하면 이전 값에서 +1 을 하여 이동 횟수를 추가해주면된다.
from collections import deque
n, m = map(int, input().split()) # 미로의 전체 모양
graph = [list(input()) for _ in range(n)] # 미로 의 전체 모양
visited = [[0] * m for _ in range(n)] # 미로의 방문 순서
dx = [-1, 0, 1, 0] # 상,하,좌,우 x변경
dy = dx[::-1] # 상,하,좌,우 y 변경
def bfs(x, y):
queue = deque([]) # BFS 를 하기위한 큐를 생성
queue.append((x, y)) # 큐에서 초기값 (x,y) 를 삽입
visited[x][y] = 1 # 해당 노드가 시작점이기 때문에 1로 초기화
while queue:
x, y = queue.popleft() # 큐 에서 값을 제거
for i in range(4): # 상,하,좌,우 위치로 이동할수 있도록 이동
nx = x + dx[i]
ny = y + dy[i]
#좌쵸 이동 조건
#1.해당 nx,ny 가 graph 안에 있어야 함
#2.해당 좌표가 이동할 수 있어 야 한다 == 1
#3.만약에 해당 노드가 방문 하지 않았으면 방문 처리해야 하기 때문에 == 0
if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == '1' and visited[nx][ny] == 0:
queue.append([nx, ny])
visited[nx][ny] = visited[x][y] + 1
bfs(0, 0)
print(visited[n - 1][m - 1])