반응형

 문제

 https://www.acmicpc.net/problem/7576


이 문제도 bfs를 통해 풀수있다.

처음에 익은 토마토를 모두 넣어주면된다.

큐가 빌때까지 반복하고 모든 토마토가 익어있을때와 모두 익지 못하는상황도 잘처리

해준다.


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
53
54
55
56
57
58
59
60
61
import sys
from collections import deque
 
def box(ripens,N,M,unripen,empty):
    if len(ripens)==N*M-empty:#처음부터 모든 토마토가 익어있다면
        return 0
 
    q=deque()
    for ripen in ripens:#익은 토마토의 위치 모두 넣어줌
        q.append(ripen)
    day=0#날짜 저장
    unripencount=0#익힌토마토수
    while q:
        [x,y]=q.popleft()
        dx=[0,1,0,-1]#왼쪽 아래쪽 오른쪽 위쪽
        dy=[-1,0,1,0]
        for i in range(4):
            nx=x+dx[i]
            ny=y+dy[i]
            if 0<=nx<and 0<=ny<and tomato[nx][ny]==0:
                tomato[nx][ny]=tomato[x][y]+1
                day=tomato[nx][ny]
                q.append([nx,ny])
                unripencount+=1#익힌토마토 추가
 
 
    if unripen==unripencount:#익힌토마토 수와 안익었던토마토 수가 일치하면
        return day-1#모두 익을때까지의 날짜
    else:#다르면 안익은 토마토가 남아있다는것
        return -1
 
 
 
M,N=map(int,sys.stdin.readline().split())
tomato=[]
for _ in range(N):
    tmp=list(map(int,sys.stdin.readline().split()))
    tomato.append(tmp)
 
 
ripen=[]#익은토마토
unripen=0
empty=0
for i in range(N):#모든 익은 토마토 찾기
    for j in range(M):
        if tomato[i][j]==1:#익은 토마토위치 모두저장
            ripen.append([i,j])
        elif tomato[i][j]==0:#안익은 토마토 개수 체크
            unripen+=1
        elif tomato[i][j]==-1:
            empty+=1
 
 
 
result=box(ripen,N,M,unripen,empty)
if result==0:
    print(0)
elif result==-1:
    print(-1)
else:
    print(result)

cs


반응형

'알고리즘(python) > 탐색' 카테고리의 다른 글

[Python]DFS와BFS 백준 1697  (0) 2020.02.15
[Python]DFS와BFS 백준 7569  (0) 2020.02.15
[Python]DFS와BFS 백준 2178  (0) 2020.02.14
[Python]DFS와BFS 백준 1012  (0) 2020.02.13
[Python]DFS와BFS 백준 2667  (0) 2020.02.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기