https://www.acmicpc.net/problem/16236
16236번: 아기 상어
N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가
www.acmicpc.net
간단한 BFS문제에 우선순위가 추가된 문제였다.
from collections import deque
import heapq
def bfs(q):
global re
vist = [[False]*n for _ in range(n)]#방문체크
h=[]#우선순위 연산을 해줄 heapq
while q:
x,y,c,size,up = q.popleft()
for k in range(4):
nx = x+dx[k]
ny = y+dy[k]
if 0<=nx<n and 0<=ny<n and not vist[nx][ny]:
vist[nx][ny]=True#방문 체크
if s[nx][ny]!=0 and s[nx][ny]<size:#먹을 수 있는 먹이의 위치 h에 저장
heapq.heappush(h,(c+1,nx,ny))#우선순위 짧은 거리>높은 위치 > 왼쪽
elif size>=s[nx][ny]:#지나갈 수 있는 조건
q.append((nx,ny,c+1,size,up))#지나갈 수 있으니 추가
if h==[]:#아무것도 먹을 수 없으니 엄마상어 호출
return True
else:
re+=h[0][0]#우선순위에 맞는 것을 하나 먹어줌
up+=1#경험치 +=1
if up==size:#조건에 나와있듯이 경험치 == 크기 -> 크기+1
up=0
size+=1
s[h[0][1]][h[0][2]]=0#맵에서 먹을 물고기는 지워줌
t = deque()
t.append((h[0][1],h[0][2],0,size,up))#상어의 현 위치 갱신
return t#위치 반환
n = int(input())
s = []
dx = [-1,0,0,1]
dy = [0,-1,1,0]
for i in range(n):
s2 = list(map(int,input().split()))
for j in range(n):
if s2[j]==9:
q=deque()
q.append([i,j,0,2,0])
s2[j]=0
s.append(s2)
re=0
while True:
q = bfs(q)#상어의 위치 갱신
if q==True:#상어의 위치가 안 바뀐거니 엄마 상어 부름
print(re)
break
'백준 파이썬 코딩' 카테고리의 다른 글
백준 17822 원판 돌리기 파이썬 (0) | 2022.09.17 |
---|---|
백준 14246 K보다 큰 구간 파이썬 반례 1개 O (2) | 2022.09.11 |
백준 17299 오등큰수 파이썬 문제 설명 O heapq사용 (0) | 2022.09.10 |
백준 12100 2048 파이썬 반례 O (0) | 2022.08.28 |
백준 10971 외판원 순회 2 파이썬 (0) | 2022.08.25 |