(백준) #16236: 아기 상어 (Python)

쉬운 목차

문제

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

참조

여기에 의존하여 코드를 개선할 수 있었습니다.