문제
https://www.acmicpc.net/problem/16236
#16236: 아기 상어
N×N 셀에는 M개의 물고기와 아기 상어 1마리가 들어 있습니다. 방은 1×1 정사각형 셀로 나뉩니다. 평방당 최대 1마리의 물고기가 있을 수 있습니다. 아기 상어와 물고기는 모두 다양한 크기로 제공됩니다.
www.acmicpc.net
- 다음 물고기먹는다
- 여러 마리의 물고기가 매우 가까이 있으면 위에 있는 물고기(여러 마리가 위에 있는 경우 가장 왼쪽에 있는 물고기)를 먹습니다.
- 상어로 작은 물고기만 먹을 수 있다같은 크기의 물고기는 통과만 가능합니다.
- 상어의 크기가 n이라면, n마리의 물고기를 먹으면 상어의 크기는 n+1입니다.된다
- 더 이상 먹을 물고기가 없는 시간을 반환합니다.
- 상어가 1칸 이동할 때마다 1초가 걸립니다.
설명
“최단 거리”와 관련된 BFS그러나 최단 거리의 여러 물고기와 함께 사용할 수 있습니다. 방향을 고려하다해야한다.
그러므로 (거리, y좌표, x좌표) 양식에 값을 저장하십시오. 최소값찾으면 우선 사항그것은 고려될 수 있습니다.
참조
여기어떤 부분이 잘못된 것인지 아래의 참고사항을 참고하시기 바랍니다.
암호
import sys
from collections import deque
input = sys.stdin.readline
def babyshark(sj, si):
queue = deque()
dist = ((0 for _ in range(N)) for _ in range(N)) # 상어와의 거리
queue.append((sj, si))
dist(sj)(si)=1
small_fish = () # 먹을 수 있는 물고기
while queue:
y, x = queue.popleft()
for yy, xx in (y-1, x), (y+1, x), (y, x-1), (y, x+1):
if yy<0 or yy>=N or xx<0 or xx>=N or dist(yy)(xx)!=0: # 범위를 벗어나거나 이미 방문했을 경우
continue
if fish(yy)(xx)>shark: # 물고기가 더 클 경우
continue
elif 0<fish(yy)(xx)<shark: # 상어가 더 클 경우
small_fish.append((dist(y)(x)+1, yy, xx))
queue.append((yy, xx))
dist(yy)(xx)=dist(y)(x)+1
if small_fish:
return min(small_fish) # (거리, y좌표, x좌표)가 가장 작은 물고기
return (0,0,0) # 먹을 수 있는 물고기가 없는 경우
# 입력
N = int(input())
fish = ()
for _ in range(N):
fish.append(list(map(int, input().split())))
sj, si = 0, 0 # 상어 위치
shark = 2 # 상어 크기
time = 0 # 시간
eat = 0 # 먹은 물고기
for j in range(N):
for i in range(N):
if fish(j)(i)==9: # 초기 상어 위치
sj, si = j, i
fish(j)(i)=0
break
while True:
d, sj, si = babyshark(sj, si)
if d==0: # 먹을 수 있는 물고기가 없는 경우
print(time)
break
time += d-1
fish(sj)(si)=0
eat += 1
if eat==shark: # 상어 크기만큼 물고기를 먹은 경우
shark += 1 # 상어 크기 증가
eat = 0
참조
여기에 의존하여 코드를 개선할 수 있었습니다.