CS/알고리즘_문제풀이(파이썬)

미로 찾기

Jedy_Kim 2021. 6. 5. 17:36
728x90

문제

아래와 같이 이동할 수 있는 길, 그리고 이동할 수 없는 벽으로 이루어진 크기 N x M 의 지도가 주어진다. 이 때, (N-1, 0) 에서 출발하여 (0, M-1) 까지 도착하는 최단거리를 출력하는 프로그램을 작성하시오. 아래 그림에 대하여 S에서 E까지 가는 최단거리는 22이다.

 

입력

첫째 줄에 지도의 세로 길이 N과 지도의 가로 길이 M이 주어진다. ( 1 ≤ N, M ≤ 1,000 ) 둘째 줄부터 지도의 정보가 주어진다. 0은 이동할 수 있는 부분, 1은 이동할 수 없는 부분을 나타낸다.

 

출력

(N-1, 0) 에서 출발하여 (0, M-1) 까지 이동하는 데 필요한 최단거리를 출력한다.

 

예제 입력

10 10

0 0 0 0 0 0 1 1 0 0

0 1 1 1 0 0 1 0 1 0

0 1 1 1 0 0 1 0 1 0

0 0 0 0 0 0 0 0 1 0

0 0 1 1 1 1 0 0 1 0

0 0 0 0 0 0 1 1 0 0

0 0 1 1 1 0 1 1 0 0

0 0 1 1 1 0 0 0 0 0

0 0 0 0 0 1 1 1 0 0

0 0 0 0 0 0 0 1 0 0

예제 출력

22

 

#코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys
from collections import deque
 
 
def bfs():
  # start 좌표 : frame[n-1+1][1]  ==> [10][1]
  # end 좌표   : frame[1][m-1+1]  ==> [1][10] 
  
  # 1. 시작점을 큐에 삽입한다.
  # 2. 시작점을 색칠한다.
  # bfs 시작
  # 3. 큐에서 하나를 뺀다. 해당 값의 현재의 위치이다.
  # 4. 인접한 모든 정점에게 방문했는지 물어보고,
  #    방문을 하지 않았다면, 색칠하고 큐에 삽입한다.
  # 5. 모두 완료했다면 다시 3번으로 돌아간다.
  global frame
  
  visited = [[False]*(m+2for _ in range((n+2))] # check[x] = True이면  [x]가 새칠됨
  deq = deque()
  deq.append((n-1+11)) 
  visited[n-1+1][1= True
  frame[n-1+1][1= 0
  cnt = 0
  # 상, 하, 좌, 우
  dx = [00-11]
  dy = [-1100
   
  while len(deq) > 0:
    x, y = deq.popleft()  
  
    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]
      if frame[nx][ny] > -1 and visited[nx][ny] == False:
        deq.append((nx, ny))
        frame[nx][ny] = frame[x][y] + 1
        visited[nx][ny] = True 
 
if __name__ == "__main__":
  n, m = map(int, sys.stdin.readline().split())
  frame = [[-1]*(m+2for _ in range(n+2)]
  getInfo = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] 
  
  for i in range(n):
    for j in range(m):
      if getInfo[i][j] == 1:
        frame[i+1][j+1= -1
      else:
        frame[i+1][j+1= getInfo[i][j]  
    
  bfs()
  print(frame[1][m-1+1])
cs

 

#복습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
from collections import deque
 
def bfs(row, col):
  global matrix, visited, n, m
  
  visited[row][col] = True
  # 상, 하, 좌, 우
  dy = [-1100]
  dx = [00-11]
  
  deq = deque()
  deq.append((row, col))
  
  while len(deq) > 0:
    popRow, popCol = deq.popleft()
    for i in range(4):
      nRow = popRow + dy[i]
      nCol = popCol + dx[i]
      
      if 0 <= nRow and nRow < n and 0 <= nCol and  nCol < m and matrix[nRow][nCol] == 0 and visited[nRow][nCol] == False:
        matrix[nRow][nCol] = matrix[popRow][popCol] + 1
        visited[nRow][nCol] = True
        deq.append((nRow, nCol))
  
 
if __name__ == "__main__":
  input = sys.stdin.readline
  
  n, m    = map(int, input().split())
  matrix  = [list(map(int, input().split())) for _ in range(n)] 
  visited = [[False]*for _ in range(n)]
  
  bfs((n-1), 0)
   
  print(matrix[0][m-1])
cs

 

# 복습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import sys 
from collections import deque
 
 
def BFS():
  global N, M, real_map
  # 상, 하, 좌, 우
  dy = [-1100]
  dx = [00-11]
  
  deq = deque()
  deq.append((N, 1))
  
  while deq:
    yPos, xPos = deq.popleft()
    
    if yPos==1 and xPos==M:
      break
    
    for i in range(4):
      ny = dy[i]+yPos
      nx = dx[i]+xPos
      if real_map[ny][nx] == 0:
        real_map[ny][nx] = real_map[yPos][xPos]+1
        deq.append((ny, nx)) 
  print(real_map[1][M]) 
 
if __name__ == "__main__":
  input = sys.stdin.readline
  
  N, M     = map(int, input().split())
  temp_map = [list(map(int, input().split())) for _ in range(N)]
  real_map = [[1]*(M+2for _ in range(N+2)]
  
  for i in range(N):
    for j in range(M):
      real_map[i+1][j+1= temp_map[i][j]
  
  BFS()
cs

 

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

목수의 미로 탈출  (0) 2021.06.05
전염병  (0) 2021.06.05
단지 번호 붙이기(dfs, bfs)[백준 2667]  (0) 2021.06.04
웜 바이러스[백준 2606]  (0) 2021.06.03
이분 그래프 판별(dfs, bfs)  (0) 2021.06.03