์ค๋๋ง์ ํ์ด๋ณธ BFS ๋ฌธ์ ์๋๋ฐ ์ด ๋ฌธ์ ๋ ์ง์ง ์ค์๋ฅผ ๊ฒ๋ ๋ง์ด ํ๋ค...
์ฐ์ ๋ก์ง ์์ฒด๋,
- ๋ถ์ด ๋จผ์ ํ์ฐํ๋ค
- ์งํ์ด๊ฐ ์ด๋ํ๋ค
- ์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ์นธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์นธ์ด ์๋ค๋ฉด ์๊ฐ ์ถ๋ ฅ ํ ์ข ๋ฃ
- ์งํ์ด๊ฐ ๋ ์ด์ ์ด๋ํ ์ ์๋ ์นธ์ด ์๋ค๋ฉด ํ์ถ ๋ถ๊ฐ IMPOSSIBLE ์ถ๋ ฅ
๋ถ์ #์ด ์๋ ๋ชจ๋ ๊ณณ์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ๊ณ , ๋ถ์ด ์ง๋๊ฐ ๊ณณ์ # ์ฒ๋ฆฌ
์งํ์ด๋ .์ธ ๊ณณ๋ง ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ๊ณ , ์งํ์ด๊ฐ ์ง๋๊ฐ ๊ณณ์ J
์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ์นธ์ด ์ฌ๋ฌ ์นธ์ผ ๋๋ฅผ ๊ณ ๋ คํ์ง ์์
1์ด ๊ทธ๋ํ
F F . . F F F
F # # . # # .
. # # J # # .
. . J J J . .
. # # J # # .
F # # . # # .
F F . . F F F
2์ด ๊ทธ๋ํ
F F F F F F F
F # # . # # F
F # # J # # .
. . J J J . .
F # # J # # .
F # # J # # F
F F F F F F F
3์ด ๊ทธ๋ํ
F F F F F F F
F # # F # # F
F # # J # # F
F . J J J . .
F # # J # # F
F # # F # # F
F F F F F F F
4์ด ๊ทธ๋ํ
F F F F F F F
F # # F # # F
F # # F # # F
F F J J J J F
F # # F # # F
F # # F # # F
F F F F F F F
์ ๊ฐ์ด๋ฐ J๊ฐ ์ค์ ์งํ์ด์ ์ถ๋ฐ์
๊ฑฐ๊ธฐ์ 4๋ฐฉํฅ์ผ๋ก ๋ป์ด๋๊ฐ๊ฒ ๋๋๋ฐ, ์ด๋ 4๋ฐฉํฅ ๋ชจ๋๊ฐ ํ์ฐ -> ๋ถ์ด ํ์ฐ -> 4๋ฐฉํฅ์์ ํ์ฐ๋ ์นธ๋ค์์ ๋ ํ์ฐ ->... ์ด๋ ๊ฒ ์งํ๋์ด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ง๊ธ์ 4๋ฐฉํฅ ์ค 1๋ฐฉํฅ๋ง ํ์ฐ -> ๋ถ ํ์ฐ -> ๋๋จธ์ง ์ค ๋ 1๋ฐฉํฅ ํ์ฐ -> ๋ถ ํ์ฐ.. ์ด๋ฐ ์์ด๋ผ์ ๋ถ์ ๋ฒ์ง์๋๊ฐ ํจ์ฌ ๋นจ๋ผ ๋ฌด์กฐ๊ฑด ํ์ถ์ด ๋ถ๊ฐํ ์ํ๊ฐ ๋จ
def exodus(J, fq):
jr, jc = J
MAZE[jr][jc] == 'J' # ์งํ์ด๊ฐ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ ๋ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ํ๊ธฐ ์ํด์
jq = [(jr, jc)]
time = 1
# ์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ์ง์ญ์ด ์๋?
while jq:
# ๋ถ์ด ๋จผ์ ํ์ฐ๋๊ณ
new_fq = []
for fr, fc in fq:
for nr, nc in (fr-1, fc), (fr+1, fc), (fr, fc-1), (fr, fc+1):
if nr<0 or nc<0 or nr>=R or nc>=C or MAZE[nr][nc] == '#':
continue
new_fq.append((nr, nc))
MAZE[nr][nc] = '#'
fq = new_fq[:]
# ๋ถ๊ณผ ๋ฒฝ, ์ด๋ฏธ ์งํ์ด๊ฐ ๋ฐฉ๋ฌธํ ๊ณต๊ฐ์ ์ ์ธํ๊ณ ์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ๋ฐฉํฅ์ผ๋ก ํ์ฐ
# ๋ ๊ฐ ์ ์๋ ๊ณณ์ด ์๋ค๋ฉด ....
jr, jc = jq.pop(0)
for _nr, _nc in (jr+1, jc), (jr-1, jc), (jr, jc+1), (jr, jc-1):
if _nr<0 or _nc<0 or _nr>=R or _nc>=C:
return time
if MAZE[_nr][_nc] != '.':
continue
MAZE[_nr][_nc] = 'J'
jq.append((_nr, _nc))
time += 1
return 'IMPOSSIBLE'
๋ถ์ ๊ฒฝ์ฐ for๋ฌธ์ผ๋ก ๋ชจ๋ ๋ถ์ด ํ์ฐํ๋๋ฐ ์งํ์ด๋ jr, jc ๋ฑ ํ๋์ ์นธ๋ง ์ด๋ํ๋ ๊ฒ์ด์๋ค... ์งํ์ด์ ์ด๋ ๋ฐฉ์๋ pop์ ์ฌ์ฉํ๋๊ฒ ์๋๋ผ for๋ฌธ์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค
new_jq = []
for jr, jc in jq:
for _nr, _nc in (jr+1, jc), (jr-1, jc), (jr, jc+1), (jr, jc-1):
if _nr<0 or _nc<0 or _nr>=R or _nc>=C:
return time
if MAZE[_nr][_nc] != '.':
continue
MAZE[_nr][_nc] = 'J'
new_jq.append((_nr, _nc))
jq = new_jq[:]
์ด ์ค์๋ ์ง์ง ๋ฉ์ฒญํ๋ค... ์์ ์ค์1์ ๊ณ ์น๋ ค๊ณ ๋๋ฒ๊น ํ๋ ค๋ค๊ฐ ํฐ์ง ์๋ฌ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋จ ๋ถ์ด ๋ฐฉ๋ฌธํ ๊ณณ์ # ์ฒ๋ฆฌ๋ฅผ ํด์ ์ฌ๋ฐฉ๋ฌธํ์ง ์๊ฒ ํ๊ณ ์์๋๋ฐ, ๋๋ฒ๊น ํ๋ต์๊ณ ์ด๊ฑธ F๋ก ๋ฐ๊ฟ๋๋ ๊ฑธ ๊ณ ์น์ง ์์์ ํฐ์ง ์๋ฌ์๋ค...
F๋ก ํ์ ๋
#๋ก ํ์ ๋
ํ ๋ง๋๋ก ๊ฑ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ์ ํด์ค์ ํฐ์ง ๋ฌธ์ ใ ใ
๊ทธ ์ธ์๋ jq ๋ฆฌ์คํธ new_jq๋ก ์ ๋ฐ๊ฟ์ ํฐ์ง ๋ฌธ์
new_jq๋ new_fq ์ด ๊ฒ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ํฐ์ง ์ค ์๊ณ ์ฝ๋ ์์ ํ ๋ฉ์ฒญ์ด ๊ฐ์ ๋ฌธ์ ใ
l์ด๋ _l ํท๊ฐ๋ฆฐ ๋ฌธ์ ๋ฑ ์ฑ๊ฒฉ ๊ธํด์ ๊ทธ๋ฅ ์ ์ถํ๋ค๊ฐ ์ฌ์ํ๋ฐ์ ์คํ๋ ์์ํ ์ค์๋ค์ด ์์๋ค..
# 908ms
def find_JF():
global J, F
for i in range(R):
for j in range(C):
if MAZE[i][j] == 'F':
F.append((i, j))
elif MAZE[i][j] == 'J':
J = [i, j]
def exodus(J, fq):
jr, jc = J
MAZE[jr][jc] == 'J' # ์งํ์ด๊ฐ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ ๋ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ํ๊ธฐ ์ํด์
jq = [(jr, jc)]
time = 1
# ์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ์ง์ญ์ด ์๋?
while jq:
# ๋ถ์ด ๋จผ์ ํ์ฐ๋๊ณ
new_fq = []
for fr, fc in fq:
for nr, nc in (fr-1, fc), (fr+1, fc), (fr, fc-1), (fr, fc+1):
if nr<0 or nc<0 or nr>=R or nc>=C or MAZE[nr][nc] == '#':
continue
new_fq.append((nr, nc))
MAZE[nr][nc] = '#'
fq = new_fq[:]
# ๋ถ๊ณผ ๋ฒฝ, ์ด๋ฏธ ์งํ์ด๊ฐ ๋ฐฉ๋ฌธํ ๊ณต๊ฐ์ ์ ์ธํ๊ณ ์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ๋ฐฉํฅ์ผ๋ก ํ์ฐ
# ๋ ๊ฐ ์ ์๋ ๊ณณ์ด ์๋ค๋ฉด ....
new_jq = []
for jr, jc in jq:
for _nr, _nc in (jr+1, jc), (jr-1, jc), (jr, jc+1), (jr, jc-1):
if _nr<0 or _nc<0 or _nr>=R or _nc>=C:
return time
if MAZE[_nr][_nc] != '.':
continue
MAZE[_nr][_nc] = 'J'
new_jq.append((_nr, _nc))
jq = new_jq[:]
time += 1
return 'IMPOSSIBLE'
R, C = map(int, input().split())
MAZE = [list(input()) for _ in range(R)]
J, F = [], []
find_JF()
print(exodus(J, F))
ํญ์ BFS ๋ง๋งํ๊ฒ ๋ณด๊ณ ํธ๋๋ฐ ๊ทธ๋์์ธ์ง ์์ํ ์ค์๋ฅผ ๊ฒ๋ ๋ง์ด ํ๋ค^^
๊ทผ๋ฐ ์ง๋ ์๋ฐ๊ธฐ์ ๋ณธ ํ 4๋ฒ์ ์ฝํ
์์ bfs ๋ฌธ์ ํ ๋ฒ๋ ์ ๋์๋ค ใ
ใ
๋ค๋ค ์ค๋ ฅ์ด ํฅ์๋๊ธด ํ๋๊ฐ๋ณด๋คใ