그래프 이론
그래프 탐색
너비 우선 탐색
https://wtg-study.tistory.com/86
https://reliablecho-programming.tistory.com/36
visit [][][i]에서 i가 0인 경우는 벽을 부술 수 있는 상태, 1인 경우는 벽을 한번 부 순상태로 나누어 푸는 문제
# 방문
visit = [[[-1]*2 for _ in range(m)] for _ in range(n)]
from collections import deque
import sys
# 내가 도착할 위치
n,m= map(int, sys.stdin.readline().split())
# 상하좌우
dirr = [-1,1,0,0]
dirc = [0,0,-1,1]
# 지도
mapp=[]
for _ in range(n) :
mapp.append(list(sys.stdin.readline().strip()))
# 방문
visit = [[[-1]*2 for _ in range(m)] for _ in range(n)]
# 큐
q=deque()
q.append((0,0,0)) # 좌표랑 벽 부숨 여부
visit[0][0][0]=1 # 안 부숨 상태 = 0
while q :
nowr, nowc, broken = q.popleft()
for i in range(4) :
if 0<=nowr+dirr[i]<n and 0<=nowc+dirc[i]<m : # 좌표만 맞는지 검사
if mapp[nowr+dirr[i]][nowc+dirc[i]] == '1' and broken==0 :
visit[nowr+dirr[i]][nowc+dirc[i]][1] = visit[nowr][nowc][0]+1
q.append((nowr+dirr[i], nowc+dirc[i], 1))
elif mapp[nowr+dirr[i]][nowc+dirc[i]] == '0' and visit[nowr+dirr[i]][nowc+dirc[i]][broken]==-1:
visit[nowr+dirr[i]][nowc+dirc[i]][broken] = visit[nowr][nowc][broken]+1
q.append((nowr+dirr[i], nowc+dirc[i], broken))
if (visit[n-1][m-1][0]!=-1 and visit[n-1][m-1][0]>0) and (visit[n-1][m-1][1]!=-1 and visit[n-1][m-1][1]>0):
print(min(visit[n-1][m-1][0], visit[n-1][m-1][1]))
elif (visit[n-1][m-1][0]!=-1 and visit[n-1][m-1][0]>0):
print(visit[n-1][m-1][0])
elif (visit[n-1][m-1][1]!=-1 and visit[n-1][m-1][1]>0):
print(visit[n-1][m-1][1])
else :
print(-1)
from collections import deque
import sys
# 내가 도착할 위치
n,m= map(int, sys.stdin.readline().split())
# 상하좌우
dirr = [-1,1,0,0]
dirc = [0,0,-1,1]
# 지도
mapp=[]
for _ in range(n) :
mapp.append(list(sys.stdin.readline().strip()))
# 방문
visit = [ list(-1 for _ in range(m)) for _ in range(n)]
# 큐
q=deque()
q.append((0,0,0))
visit[0][0]=1
while q :
nowr, nowc, broken = q.popleft()
for i in range(4) :
if 0<=nowr+dirr[i]<n and 0<=nowc+dirc[i]<m \
and visit[nowr+dirr[i]][nowc+dirc[i]]==-1 :
if broken==0 and mapp[nowr+dirr[i]][nowc+dirc[i]] == '1':
visit[nowr+dirr[i]][nowc+dirc[i]] = visit[nowr][nowc]+1
q.append((nowr+dirr[i], nowc+dirc[i], 1))
if mapp[nowr+dirr[i]][nowc+dirc[i]] == '0':
visit[nowr+dirr[i]][nowc+dirc[i]] = visit[nowr][nowc]+1
mapp[nowr+dirr[i]][nowc+dirc[i]] = '1'
q.append((nowr+dirr[i], nowc+dirc[i], broken))
if visit[n-1][m-1]!=-1 :
print(visit[n-1][m-1])
else :
print(-1)