-
2206 벽 부수고 이동하기코테 대비 python/백준 2023. 3. 8. 11:27
https://www.acmicpc.net/problem/2206
2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
from collections import deque n,m = map(int,input().split()) graph = [ list(map(int,input())) for _ in range(n) ] #print(graph) #상하좌우 dx = [-1,1,0,0] dy = [0,0,-1,1] #벽을 부순것을 어떻게 표기 할 것인지가 핵심!! #week5 PGS 경주로건설과 비슷한 발상 #조건을 체크하기 편하기 위해서 vsitied[x][y][z] 이렇게 방문여부 확인 visited = [[[0] * 2 for _ in range(m)] for _ in range(n)] #print(visited) def bfs(x,y,wall): q=deque() q.append((x,y,wall)) #방문표시 visited[0][0][0]=1 #bfs루틴 while q: x,y,z = q.popleft() #만약 n,m까지 갔다면 해당위치 거리까지 반환 if x==n-1 and y ==m-1: return visited[x][y][z] for i in range(4): nx=x+dx[i] ny=y+dy[i] #범위안이야? if 0<=nx<n and 0<=ny<m: # 벽 없고, 방문한적 없어 if graph[nx][ny] == 0 and visited[nx][ny][z] == 0: #이동해야지 근데 ? visited에 숫자 추가해서 기록 아기상어2 참고 visited[nx][ny][z]= visited[x][y][z]+1 q.append((nx,ny,z)) # 만약 벅있고, 벽을 부순적 없다면?? elif graph[nx][ny]==1 and z==0: #벽을 부수고 visited에 숫자 추가 #벽 부쉈으니깐 z = 1체크 visited[nx][ny][z+1] = visited[x][y][z]+1 q.append((nx,ny,z+1)) #끝까지 못간다면 -1 반환 return -1 #항상 시작은 000 print(bfs(0,0,0))
'코테 대비 python > 백준' 카테고리의 다른 글
1003 피보나치 함수 (1) 2023.03.09 13459 구슬탈출 (0) 2023.03.09 14502 연구소 (0) 2023.03.07 1260 dfs bfs (0) 2023.03.07 17086 아기상어2 (0) 2023.03.07