๐ณ ๋งํฌ
๐ ๋ฌธ์
NรN ํฌ๊ธฐ์ ๊ณต๊ฐ์ ๋ฌผ๊ณ ๊ธฐ M๋ง๋ฆฌ์ ์๊ธฐ ์์ด 1๋ง๋ฆฌ๊ฐ ์๋ค. ๊ณต๊ฐ์ 1ร1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ํ ์นธ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ต๋ 1๋ง๋ฆฌ ์กด์ฌํ๋ค.
์๊ธฐ ์์ด์ ๋ฌผ๊ณ ๊ธฐ๋ ๋ชจ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด ํฌ๊ธฐ๋ ์์ฐ์์ด๋ค. ๊ฐ์ฅ ์ฒ์์ ์๊ธฐ ์์ด์ ํฌ๊ธฐ๋ 2์ด๊ณ , ์๊ธฐ ์์ด๋ 1์ด์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ํ ์นธ์ฉ ์ด๋ํ๋ค.
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ณ , ๋๋จธ์ง ์นธ์ ๋ชจ๋ ์ง๋๊ฐ ์ ์๋ค. ์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ๋จน์ ์ ์๋ค. ๋ฐ๋ผ์, ํฌ๊ธฐ๊ฐ ๊ฐ์ ๋ฌผ๊ณ ๊ธฐ๋ ๋จน์ ์ ์์ง๋ง, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๋ค.
์๊ธฐ ์์ด๊ฐ ์ด๋๋ก ์ด๋ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
๋ ์ด์ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๊ณต๊ฐ์ ์๋ค๋ฉด ์๊ธฐ ์์ด๋ ์๋ง ์์ด์๊ฒ ๋์์ ์์ฒญํ๋ค.
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ 1๋ง๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ 1๋ง๋ฆฌ๋ณด๋ค ๋ง๋ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
๊ฑฐ๋ฆฌ๋ ์๊ธฐ ์์ด๊ฐ ์๋ ์นธ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ ๋, ์ง๋์ผํ๋ ์นธ์ ๊ฐ์์ ์ต์๊ฐ์ด๋ค.
๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋ง๋ค๋ฉด, ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋ฌํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ๋ง๋ฆฌ๋ผ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.
์๊ธฐ ์์ด์ ์ด๋์ 1์ด ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ฆ, ์๊ธฐ ์์ด๊ฐ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ฉด, ์ด๋๊ณผ ๋์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฉด, ๊ทธ ์นธ์ ๋น ์นธ์ด ๋๋ค.
์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ์ ๊ฐ์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋ ๋ง๋ค ํฌ๊ธฐ๊ฐ 1 ์ฆ๊ฐํ๋ค. ์๋ฅผ ๋ค์ด, ํฌ๊ธฐ๊ฐ 2์ธ ์๊ธฐ ์์ด๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋ง๋ฆฌ ๋จน์ผ๋ฉด ํฌ๊ธฐ๊ฐ 3์ด ๋๋ค.
๊ณต๊ฐ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์๊ธฐ ์์ด๊ฐ ๋ช ์ด ๋์ ์๋ง ์์ด์๊ฒ ๋์์ ์์ฒญํ์ง ์๊ณ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์๋จน์ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ณต๊ฐ์ ํฌ๊ธฐ N(2 โค N โค 20)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ณต๊ฐ์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. ๊ณต๊ฐ์ ์ํ๋ 0, 1, 2, 3, 4, 5, 6, 9๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์๋์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
0: ๋น ์นธ
1, 2, 3, 4, 5, 6: ์นธ์ ์๋ ๋ฌผ๊ณ ๊ธฐ์ ํฌ๊ธฐ
9: ์๊ธฐ ์์ด์ ์์น
์๊ธฐ ์์ด๋ ๊ณต๊ฐ์ ํ ๋ง๋ฆฌ ์๋ค.
๐พ ํ์ด ๋ฐฉ๋ฒ
https://dailyheumsi.tistory.com/59
์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด, dfs๋ฅผ ์ด์ฉํ๊ณ ํ์๋๋ฐ ํด๊ฒฐ๋์ง ์์๋ค. ๊ทธ๋์ ์ ํฐ์คํ ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํด์ ํด๊ฒฐํ๋ค... ใ
ใ
๋ชจ๋ ํ ์คํธ์ผ์ด์ค ์ฑ๊ณต ์ฝ๋
from collections import deque
import sys
sys.stdin = open("input.txt", "rt")
dx = [-1,0,0,1]
dy = [0,-1,1,0]
def bfs(_x,_y):
q, visited = deque([(_x,_y)]), set([(_x,_y)])
seconds = 0 # ๊ฑธ๋ฆฐ ์ด
baby = 2 # ์๊ธฐ ์์ด์ ํฌ๊ธฐ
eat = 0 # ํ์ฌ ํฌ๊ธฐ์์ ์ง๊ธ๊น์ง ๋จน์ ๋จน์ด์ ์
eat_flag = False # ํ์ฌ ์ํ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๊ฒฝ์ฐ, for _ in range(size)๋ฅผ ์คํํ์ง ์๊ธฐ ์ํ ํ๋๊ทธ
answer = 0
while q:
size = len(q)
q = deque(sorted(q))
for _ in range(size):
x, y = q.popleft()
# ํ์ฌ ์์น์ ์๊ธฐ ์์ด๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ด, ์ด๋ฅผ ๋จน์ ๊ฒฝ์ฐ
if space[x][y] != 0 and space[x][y] < baby:
space[x][y] = 0
eat += 1
if eat == baby:
baby += 1
eat = 0
q, visited = deque(), set([(x,y)])
eat_flag = True
answer = seconds
for _dx, _dy in zip(dx, dy):
nx, ny = x + _dx, y + _dy
if 0 <= nx < n and 0 <= ny < n and (nx, ny) not in visited:
if space[nx][ny] <= baby:
q.append((nx,ny))
visited.add((nx,ny))
if eat_flag:
eat_flag = False
break
seconds += 1
return answer
n = int(sys.stdin.readline().strip())
space = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]
# ์ด๊ธฐ ์์ด์ ์์น๋ฅผ ํ์
ํ๊ณ , ํด๋น ์๋ฆฌ๋ฅผ ํ์์ ๋น์ด๋ค.
x,y = None, None
for i in range(n):
for j in range(n):
if space[i][j] == 9:
x,y = i,j
space[i][j] = 0
i = n + 1
break
# ์์์ ์์ bfs๋ฅผ ์งํํ๋ค.
print(bfs(x,y))
์ค๋ต ์ฝ๋
import sys
sys.stdin = open("input.txt","rt")
sys.setrecursionlimit(10 ** 5)
# def calcDist(point1, point2):
# x1, y1 = point1[0], point1[1]
# x2, y2 = point2[0], point2[1]
# return (x1-x2)**2 + (y1-y2)**2
dx = [-1,1,0,0]
dy = [0,0,1,-1]
res = float('inf')
def calcDist(start, end):
# start์์ end๋ก ์๊ธฐ์์ด๋ฅผ ์ฎ๊ธฐ๋๋ฐ ๋๋ ์ต๋จ๊ฑฐ๋ฆฌ
global cnt, res
if start == end:
res = cnt if cnt < res else res
return cnt
else:
x, y = start
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n and space[nx][ny] <= size_baby and visit[nx][ny] == 0:
visit[nx][ny] = 1
cnt += 1
calcDist([nx,ny], end)
visit[nx][ny] = 0
cnt -= 1
return res
n = int(sys.stdin.readline().strip())
space = list()
size_baby = 2 # ์๊ธฐ์์ด์ ๊ธธ์ด
loc_baby = []
food = list() #์ฒ์์ ํฌ๊ธฐ๊ฐ 1์ธ ๋จน์ด๋ฅผ ์ ์ฅ
seconds = 0
min_food = 1
def isFoodAvaliable(li, size):
for i in range(n):
for j in range(n):
if 0 < li[i][j] <= size:
food.append([i,j])
keyNum = 0
for i in range(n):
temp = list(map(int,sys.stdin.readline().split()))
for j in range(n):
if temp[j] == 1:
food.append([i,j]) #[์ขํ]
keyNum += 1
if temp[j] == 9: #์๊ธฐ ์์ด์ ์์น
loc_baby = [i,j]
space.append(temp)
eat = 0
while True:
if len(food) == 0:
break
dist = list()
for i in range(len(food)):
cnt = 0
visit = [[0] * n for _ in range(n)]
visit[loc_baby[0]][loc_baby[1]] = 1
res = float('inf')
dist.append([i, calcDist(loc_baby,food[i])]) #[food์์์ ์ธ๋ฑ์ค, ๊ฑฐ๋ฆฌ]
dist.sort(key=lambda x:x[1])
# ์ด๋
idx,d = dist.pop(0)
seconds += d
x, y = loc_baby
space[x][y] = 0
loc_baby = food[idx] #์๊ธฐ์์ด์ ์์น๋ฅผ ์ฎ๊ฒจ์ค
x, y = loc_baby
space[x][y] = 0
food.pop(idx) #๋จน์๊ฐ์์ ๋จน์ ๊ฒ์ ์์ ์ค
eat += 1 #๋จน์๋ค 1 ์ฆ๊ฐ
if eat == size_baby: #์์ ์ ํฌ๊ธฐ์ ๊ฐ์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์๋ค๋ฉด
size_baby += 1 #์๊ธฐ์์ด ํฌ๊ธฐ 1 ์ฆ๊ฐ
min_food += 1 #๋จน์ ์ ์๋ ๋จน์ด ํฌ๊ธฐ 1 ์ฆ๊ฐ
eat = 0
food = list() # food ์ด๊ธฐํ, ์๋๋ฉด ๊ฑฐ๋ฆฌ๊ฐ ์
๋ฐ์ดํธ ๋์ด์ผํจ.....
isFoodAvaliable(space, min_food)
print(seconds)