기본적인 BFS 문제에서 조금의 변형이 들어간 문제다.
처음 활용된 것은 물이라는 장애물도 퍼져나간다는것이다.
물 -> 길 ->물 ->길을 while안에서 활용했다
-항상 특정지점의 주변 모두를 한턴에 체크(FALSE)할때는 for(len(stack))구조로 활용해 주면 된다.
-추가적으로 최단거리를 세기 위해서는 다른 리스트를 하나 더 만들어 수를 파악해주면 된다
import sys
import collections
n,m = map(int,input().split())
lit =[]
ans =0
for i in range(n):
tt = list(sys.stdin.readline())
lit.append(tt)
dx = [0,0,1,-1]
dy = [1,-1,0,0]
def bfs(start,wate):
global ans
water = wate
stack = start
while stack:
ans += 1
howmany = len(water)
for _ in range(howmany):
t = water[0][0]
w = water[0][1]
water.popleft()
for i in range(4):
T = t+dx[i]
W = w+dy[i]
if 0 <= T <n and 0<=W<m and visited[T][W] == False and lit[T][W] != "D":
visited[T][W] = True
water.append([T,W])
for _ in range(len(stack)):
x = stack[0][0]
y = stack[0][1]
stack.popleft()
for i in range(4):
X = x+dx[i]
Y = y+dy[i]
if 0<=X<n and 0<= Y<m and visited[X][Y] == False:
stack.append([X,Y])
visited[X][Y] = True
count[X][Y] = ans
if lit[X][Y] == "D":
return ans
return 0
visited =[[False for i in range(m)] for j in range(n)]
count = [[0 for i in range(m)] for j in range(n)]
start =collections.deque()
water =collections.deque()
arr = []
for i in range(n):
for j in range(m):
if lit[i][j] == "S":
start.append([i,j])
visited[i][j] = True
elif lit[i][j] == "*":
water.append([i,j])
visited[i][j] =True
elif lit[i][j] =="D":
arr.append([i,j])
elif lit[i][j] =="X":
visited[i][j] =True
t = bfs(start,water)
if t == 0:
print("KAKTUS")
else:
print(t)
'Data Science > 알고리즘 공부' 카테고리의 다른 글
[백준][파이썬] 2206 벽 부수고 이동하기 - 메모리초과 (0) | 2020.04.13 |
---|---|
[백준][파이썬] 16768 Mooyo Mooyo (0) | 2020.04.08 |
[백준][알고리즘] 14888 연산자 끼워넣기 (0) | 2020.04.06 |
[백준][파이썬] 10971 원판원 순회2 - 시간초과.. (0) | 2020.04.06 |
[백준][파이썬] 10974 모든 순열 (0) | 2020.04.05 |
댓글