๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ช๐Ÿป์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๋ฐฑ์ค€ & ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[BFS, ๊ตฌํ˜„] ๋ฐฑ์ค€ 16236 ์•„๊ธฐ ์ƒ์–ด python

๐Ÿ“„ ๋ฐฑ์ค€ 16236 ์•„๊ธฐ ์ƒ์–ด python ๐Ÿ“„

www.acmicpc.net/problem/16236

 

16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€

www.acmicpc.net


๐Ÿค” ๋ฌธ์ œ ํ’€์ด  ๐Ÿค”

์ฒซ๋ฒˆ์งธ ์‹œ๋„์—์„œ ์ •ํ™•ํžˆ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ์ธํ„ฐ๋„ท์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•˜์˜€๋‹ค.

 

๋‚ด๊ฐ€ ์ด ๋ฌธ์ œ์—์„œ ๋†“์นœ ํฌ์ธํŠธ๋Š”

  1. ์ฒ˜์Œ ์•„๊ธฐ์ƒ์–ด์˜  ์œ„์น˜๋ฅผ ์ €์žฅํ•œ ํ›„ ๋งต์—์„œ ์•„๊ธฐ์ƒ์–ด ์œ„์น˜๋ฅผ 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์ง€ ์•Š์•˜๋‹ค. (ํฌ๊ธฐ๊ฐ€ 9์ธ ์ƒ์–ด๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋จ)
  2. BFS๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” queue์˜ ์†์„ฑ์„ ์ด์šฉํ•ด ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๋ฅผ ์ฐพ์€ ํšŸ์ˆ˜๊นŒ์ง€๋งŒ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. (count > flag: break)
  3. ์ตœ์†Œ ์ด๋™ํšŸ์ˆ˜์—์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜๋ฅผ queue์™€๋Š” ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค.
  4. ๋งจ์œ„ ์™ผ์ชฝ ๋งจ ๋์— ์œ„์น˜ํ•œ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จผ์ € ๋จน๋Š”๋‹ค๋Š” ๊ฒƒ์€ (์„ธ๋กœ, ๊ฐ€๋กœ) ์ˆœ์„œ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

์ด ํฌ์ธํŠธ๋“ค์„ ์กฐ๊ธˆ ๋” ์‹ ๊ฒฝ์“ฐ๋ฉด ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ํ• ์ˆ˜ ์žˆ๋‹ค.


โŒจ๏ธ ์ฝ”๋“œ โŒจ๏ธ

from collections import deque

n = int(input())

arr = [list(map(int, input().split())) for _ in range(n)]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

sx, sy = 0, 0
for i in range(n):
    for j in range(n):
        if arr[i][j] == 9:
            arr[i][j] = 0
            sx, sy = i, j
            break
size = 2
move_num = 0
eat = 0
while True:
    q = deque()
    q.append((sx, sy, 0))
    visited = [[False] * n for _ in range(n)]
    flag = 1e9
    fish = []
    while q:
        x, y, count = q.popleft()

        if count > flag:
            break
        for k in range(4):
            nx, ny = x + dx[k], y + dy[k]
            if nx < 0 or ny < 0 or nx >= n or ny >= n:
                continue
            if arr[nx][ny] > size or visited[nx][ny]:
                continue

            if arr[nx][ny] != 0 and arr[nx][ny] < size:
                fish.append((nx, ny, count + 1))
                flag = count
            visited[nx][ny] = True
            q.append((nx, ny, count + 1))

    if len(fish) > 0:
        fish.sort()
        x, y, move = fish[0][0], fish[0][1], fish[0][2]
        move_num += move
        eat += 1
        arr[x][y] = 0
        if eat == size:
            size += 1
            eat = 0
        sx, sy = x, y
    else:
        break

print(move_num)

Reference

rebas.kr/714