[BOJ][๐ก4][๋ฐฑ์ค#05427] ๋ถ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์๊ทผ์ด๋ ๋น ๊ณต๊ฐ๊ณผ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฑด๋ฌผ์ ๊ฐํ์๋ค. ๊ฑด๋ฌผ์ ์ผ๋ถ์๋ ๋ถ์ด ๋ฌ๊ณ , ์๊ทผ์ด๋ ์ถ๊ตฌ๋ฅผ ํฅํด ๋ฐ๊ณ ์๋ค. ๋งค ์ด๋ง๋ค, ๋ถ์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ์ธ์ ํ ๋น ๊ณต๊ฐ์ผ๋ก ํผ์ ธ๋๊ฐ๋ค. ๋ฒฝ์๋ ๋ถ์ด ๋ถ์ง ์๋๋ค. ์๊ทผ์ด๋ ๋์๋จ๋ถ ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค. ์๊ทผ์ด๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๊ณ , ๋ถ์ด ์ฎ๊ฒจ์ง ์นธ ๋๋ ์ด์ ๋ถ์ด ๋ถ์ผ๋ ค๋ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค. ์๊ทผ์ด๊ฐ ์๋ ์นธ์ ๋ถ์ด ์ฎ๊ฒจ์ด๊ณผ ๋์์ ๋ค๋ฅธ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค. ๋น๋ฉ์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ผ๋ง๋ ๋นจ๋ฆฌ ๋น๋ฉ์ ํ์ถํ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ํ ์คํธ ์ผ์ด์ค๋ ์ต๋ 100๊ฐ์ด๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ๋น๋ฉ ์ง๋์ ๋๋น์ ๋์ด w์ h๊ฐ ์ฃผ์ด์ง๋ค. (1 โค w,h โค 1000) ๋ค์ h๊ฐ ์ค์๋ w๊ฐ์ ๋ฌธ์, ๋น๋ฉ์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค.
โ.โ: ๋น ๊ณต๊ฐ โ#โ: ๋ฒฝ โ@โ: ์๊ทผ์ด์ ์์ ์์น โ*โ: ๋ถ
๊ฐ ์ง๋์ @์ ๊ฐ์๋ ํ๋์ด๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ๋น๋ฉ์ ํ์ถํ๋๋ฐ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋น๋ฉ์ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ โIMPOSSIBLEโ์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
5
4 3
####
#*@.
####
7 6
###.###
#*#.#*#
#.....#
#.....#
#..@..#
#######
7 4
###.###
#....*#
#@....#
.######
5 5
.....
.***.
.*@*.
.***.
.....
3 3
###
#@#
###
์ถ๋ ฅ
2
5
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
My Sol
from collections import deque
def findsang():
global mat
for i in range(I):
for j in range(J):
if mat[i][j]=='@':
return i, j
def main():
# ๋ถ ์ขํ ํ์ธ
fires = deque()
fl = 0
for i in range(I):
for j in range(J):
if mat[i][j] == '*':
fires.append((i, j))
fl += 1
# ์๊ทผ ์ขํ ํ์ธ
ni, nj = findsang()
sangmoves = deque()
sangmoves.append((ni, nj))
ml = 1
# visit
firevisit = [[0]*J for _ in range(I)]
for fi, fj in fires:
firevisit[fi][fj] = 1
sangvisit = [[0]*J for _ in range(I)]
sangvisit[ni][nj] = 1
time = 1
while sangmoves:
# ๋ถ ์ด๋
for _ in range(fl):
fi, fj = fires.popleft()
fl -= 1
for di, dj in ((-1, 0), (1, 0), (0, -1), (0, 1)):
sfi, sfj = fi+di, fj+dj
if not (0<=sfi<I and 0<=sfj<J): continue
if firevisit[sfi][sfj]: continue
if mat[sfi][sfj] == '#': continue
firevisit[sfi][sfj] = 1
fires.append((sfi, sfj))
fl += 1
# ์๊ทผ ์ด๋
for _ in range(ml):
ni, nj = sangmoves.popleft()
ml -= 1
for di, dj in ((-1, 0), (1, 0), (0, -1), (0, 1)):
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): return time
if firevisit[si][sj]: continue
if sangvisit[si][sj]: continue
if mat[si][sj]=='#': continue
sangvisit[si][sj] = 1
sangmoves.append((si, sj))
ml += 1
time += 1
return 'IMPOSSIBLE'
T = int(input())
for _ in range(T):
J, I = map(int, input().split())
mat = [list(input()) for _ in range(I)]
print(main())
BFS๋ฅผ 2์ค์ผ๋ก ์ฌ์ฉํ๋ ๋ฌธ์ ์๋ค. ๋ถ์ด ์ด๋ํ๊ณ , ์๊ทผ์ด๊ฐ ์ด๋ํ๋ ์ํฉ์ ๊ณ ๋ คํด์ ์๊ทผ์ด๊ฐ ๋ฒ์ ์ธ๋ก ์ด๋ํ๊ฒ ๋๋ค๋ฉด ํ์ถํ๊ธฐ๊น์ง while๋ฌธ์ ๋ฐ๋ณต ํ์๋ฅผ ๋ฐํํ๊ณ , ์๊ทผ์ด๊ฐ ์ด๋ํ ์ ์๋ ์ขํ์ ์งํฉํ์ธ sangmoves๊ฐ ๋น๋ค๋ฉด, ๋ถ์ด๋ ์ฌ๋ฌ ์์ธ์ผ๋ก ์๊ทผ์ด๊ฐ ์ด๋ํ ์ ์๋ ๊ฒ์ด๋ฏ๋ก IMPOSSIBLE์ ๋ฐํํ๋ค.
์ด ๋ฐํ๊ฐ์ ํ ์คํธ์ผ์ด์ค๋ง๋ค ์ถ๋ ฅํด์ฃผ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ