[๋ฐฑ์ค€] 5427๋ฒˆ. ๋ถˆ ๐Ÿ”ฅ๐Ÿ”ฅ

hagnoykmikยท2023๋…„ 11์›” 18์ผ
0

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
28/36
post-thumbnail

[๋ฐฑ์ค€] 5427๋ฒˆ. ๋ถˆ ๐Ÿ”ฅ๐Ÿ”ฅ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•„์ด๋””์–ด

  • ์ €๋ฒˆ์— ํ’€์—ˆ๋˜ ๋ถˆ!๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋กœ ํ’€์—ˆ๋‹ค.
    1. ์ƒ๊ทผ์ด๊ฐ€ ๋จผ์ € ์ด๋™
    2. ๋ถˆ์ด ์ด๋™
    3. ๊ฐ€์žฅ์ž๋ฆฌ์— ์˜ค๋ฉด ํƒˆ์ถœ
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋”ฐ๋กœ ํ•ด์ฃผ์ง€์•Š๊ณ ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์€ ๋” ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.
    • ์•„์˜ˆ ์ƒ๊ทผ์ด ์œ„์น˜๋ฅผ ์ฐพ์„ ๋•Œ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ํƒˆ์ถœ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ ๋”ฐ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ƒ๊ฐ์„ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ ํƒ์ƒ‰ํ•  ๋•Œ ๋‹ค์Œ์œ„์น˜๊ฐ€ ๊ฐ€์žฅ์ž๋ฆฌ๋ฉด ํƒˆ์ถœ
    • ๊ทผ๋ฐ ์‚ฌ์‹ค ๋ณ„๋กœ ์‹œ๊ฐ„์ฐจ์ด ์•ˆ๋‚จ..

์‹œ๊ฐ„ ๋ณต์žก๋„

  • escape ์ฝ”๋“œ : O(w * h)
  • ์ „์ฒด ์ฝ”๋“œ : O(t * w * h)

์ฝ”๋“œ

  • ์ฒ˜์Œ ์ฝ”๋“œ(์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋”ฐ๋กœํ•œ ์ฝ”๋“œ)
from collections import deque
import sys
input = sys.stdin.readline

def escape():
    while q:
        x, y, time = q.popleft()


        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            # ์ƒ๊ทผ์ด
            if building[x][y] == '@':
                if 0 <= nx < h and 0 <= ny < w:
                    if building[nx][ny] == '.':
                        q.append((nx, ny, time + 1))
                        building[nx][ny] = '@'
                else:
                    return time + 1
            # ๋ถˆ
            else:
                if 0 <= nx < h and 0 <= ny < w and building[nx][ny] != '#' and building[nx][ny] != '*':
                    q.append((nx, ny, -1))
                    building[nx][ny] = '*'
    
    return "IMPOSSIBLE"


t = int(input())
for _ in range(t):
    w, h = map(int, input().split())

    building = [list(input().strip()) for _ in range(h)]
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    q = deque([])
    time = 0

    # ์œ„์น˜ ์ฐพ๊ธฐ
    for x in range(h):
        for y in range(w):
            # ์ƒ๊ทผ์ด
            if building[x][y] == '@':
                # ๋ฐ”๋กœ ํƒˆ์ถœ ๊ฐ€๋Šฅํ•˜๋ฉด ํƒˆ์ถœํ•˜๊ธฐ
                if not( 0 < x < (h - 1) and 0 < y < (w - 1)):
                    time = 1
                    break
                q.appendleft((x, y, 0))
            # ๋ถˆ
            elif  building[x][y] == '*':
                q.append((x, y, -1))
        if time > 0:
            break


    # ํƒˆ์ถœํ•˜๊ธฐ
    if time == 0:
        time = escape()
    
    print(time)
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋”ฐ๋กœ ์•ˆํ•˜๊ณ  ํ•ฉ์นœ ์ฝ”๋“œ
from collections import deque
import sys
input = sys.stdin.readline

def escape():
    while q:
        x, y, time = q.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            # ์ƒ๊ทผ์ด
            if building[x][y] == '@':
                # ๊ฐ€์žฅ์ž๋ฆฌ๋ผ์„œ ๋ฐ”๋กœ ํƒˆ์ถœ ๊ฐ€๋Šฅํ•  ๋•Œ
                if nx < 0 or ny < 0 or nx >= h or ny >= w:
                    return time + 1
                # ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๋ฒ”์œ„์ผ ๋•Œ
                elif 0 <= nx < h and 0 <= ny < w: 
                    if building[nx][ny] == '.':
                        q.append((nx, ny, time + 1))
                        building[nx][ny] = '@'
            # ๋ถˆ
            else:
                if 0 <= nx < h and 0 <= ny < w and building[nx][ny] != '#' and building[nx][ny] != '*':
                    q.append((nx, ny, -1))
                    building[nx][ny] = '*'
    
    return "IMPOSSIBLE"


t = int(input())

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

for _ in range(t):
    w, h = map(int, input().split())
    building = [list(input().strip()) for _ in range(h)]
    q = deque([])
    
    # ์œ„์น˜ ์ฐพ๊ธฐ
    for x in range(h):
        for y in range(w):
            # ์ƒ๊ทผ์ด
            if building[x][y] == '@':
                q.appendleft((x, y, 0))
            # ๋ถˆ
            elif  building[x][y] == '*':
                q.append((x, y, -1))

    # ํƒˆ์ถœํ•˜๊ธฐ
    print(escape())
profile
์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž, ๊น€๊ฒฝ์•„์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€