ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
๋ฌธ์ ๋ฅผ ๋จ์ํ๊ฒ ๋ณด๋ฉด, ์ฒซ ๋ฒ์งธ BFS๋ฅผ ํ์์ ํตํด ํ์์ ์์น๋ก๋ถํฐ ์๋์ ์์น๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ BFS ํ์์ ํตํด ์๋์ ๋ชฉ์ ์ง๊น์ง ๋๋ฌํ ์ ์๋์ง๋ฅผ ์ฐพ๋๋ค.
๋จ์ํ BFS๋ฅผ ๋ ๋ฒ ์๊ฐํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ์ง๋ง ๋ฌธ์ ์ ์ ์๋๋ ์กฐ๊ฑด๋ค์ ์ง์ผ์ผ ํ๋ค.
- ํ์์ ์๋๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๊ณ , ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ์๋๋ถํฐ ํ์ด๋ค.
- ์๋์ด ์๋ ๊ณณ ๊น์ง ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
- ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ์๋์ด ์ฌ๋ฌ ๋ช ์ผ ๊ฒฝ์ฐ, `[๊ฑฐ๋ฆฌ, ํ, ์ด]`์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์ฒซ ๋ฒ์งธ ์๋์ ํ์ด๋ค.
- ์๋์ด ์๋ ๊ณณ ๊น์ง ์ด๋ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ
- ์ฐ๋ฃ๊ฐ 0์ด ๋ ๊ฒฝ์ฐ๋ก -1์ ๋ฐํํ๋ค.
- ์๋์ด ์๋ ๊ณณ ๊น์ง ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
- ์๋์ ๋ชฉ์ ์ง๊น์ง ์ด๋ ๊ฐ๋ฅํ์ง ํ์
ํ๋ค.
- ํ์์ ์ถ๋ฐ์์น๋ ์๋์ด ์๋ ์์น๊ฐ ๋๋ค.
- ์๋์ ๋ชฉ์ ์ง ๊น์ง ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
- ๋ค์ ์น๊ฐ์ ํ์ฐ๊ธฐ ์ํด, ํ์์ ์์น๊ฐ ์๋์ ๋ชฉ์ ์ง๊ฐ ๋๋ค.
- ์ฐ๋ฃ๋ ๋ชฉ์ ์ง ๊น์ง ์ด๋ํ ๊ฑฐ๋ฆฌ * 2 ๋งํผ ์ถฉ์ ํ๋ค.
- ์ด๋ ํ์ฌ์ฐ๋ฃ - ์ฌ์ฉํ ์ฐ๋ฃ + ์ด๋ํ ๊ฑฐ๋ฆฌ * 2์ด์ง๋ง, ํ์ฌ ์ฐ๋ฃ + ์ด๋ํ ๊ฑฐ๋ฆฌ์๋ ๊ฐ๋ค.
- ์๋์ ๋ชฉ์ ์ง๊น์ง ์ด๋ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ
- ์ฐ๋ฃ๊ฐ 0์ด ๋ ๊ฒฝ์ฐ๋ก -1์ ๋ฐํํ๋ค.
์ฒ์์ ํ ๋, `์๋๋ง๋ค BFS๋ก ํ์ ํ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์`ํ๋ค. ์ฒ์์๋ ๋ค๋ฅธ ๋ก์ง์์ ์๊ฐ์ ์ก์๋จน๋ ์ค ์๊ณ ํ ์๊ฐ ๋์ ๋๋ฒ๊น ์ ํ๋๋ฐ... ๋์ ํ ๋ชป ์ฐพ๊ฒ ์ด์ ๋ฐฑ์ค์ ์ง๋ฌธ ๋ต๋ณ ๊ฒ์ํ์ ์ฐธ๊ณ ํ์๋ค. ์๊ฐํด๋ณด๋, ํ์ ์์น๋ก๋ถํฐ ์๋์ ์์น๋ฅผ ์ฐพ๋ ๋ฐ๋ BFS๋ฅผ ํ ๋ฒ๋ง ๋๋ฉด ๋๋๋ฐ ์ ์๋๋งํผ ๋๊ณ ์์๋๊ฐ ์ถ์๋ค.๐
์ฝ๋
from sys import stdin
from collections import deque
WALL = 1
def visitable(r, c):
return 0 <= r < N and 0 <= c < N and board[r][c] != WALL
def bfs(t_r, t_c):
visited = [[0] * N for _ in range(N)]
q = deque([[t_r, t_c]])
visited[t_r][t_c] = 1
while q:
r, c = q.popleft()
for dr, dc in dirs:
next_r, next_c = r + dr, c + dc
if visitable(next_r, next_c) and not visited[next_r][next_c]:
visited[next_r][next_c] = visited[r][c] + 1
q.append((next_r, next_c))
return visited
def find_passenger():
dist_board = bfs(*taxi)
p_dist = []
for idx, info in enumerate(passengers):
# ์๋ ์ค๋ณต ํ์ธ ๋ฐฉ์ง.
if pick_up[idx]:
continue
# ํ์ ์์น๋ฅผ 1๋ก ์์ํ๋ฏ๋ก, -1ํด์ค์ผ ํจ
cur_dist = dist_board[info[0]][info[1]] - 1
# ์ฐ๋ฃ๊ฐ ์๊ณ ๋ฐฉ๋ฌธ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์ค๋จ
if fuel - cur_dist <= 0 or cur_dist == -1:
print(-1)
exit(0)
p_dist.append([cur_dist, info[0], info[1], idx])
# 2. ๊ฑฐ๋ฆฌ, R, C ์์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ์์ผ๋ฏ๋ก ์ ๋ ฌํ๋ฉด ์์ฐจ์ ์ผ๋ก ๋จ.
# ๊ฐ์ฅ ๊ฐ๊น์ด ์น๊ฐ๋ง ๋ฐํ.
return sorted(p_dist)[0]
def move_passenger(p_dist):
global fuel, taxi
dist, _, _, idx = p_dist
# ๊ฐ์ฅ ๊ฐ๊น์ด ์น๊ฐ์ด ์๋ ์์น๋ก ์ด๋
taxi = passengers[idx][:2]
# ์น๊ฐ์ด ์๋ ๊ณณ ๊น์ง ์ฌ์ฉํ ์ฐ๋ฃ ๊ฐ์
fuel -= dist
# ์๋ pick up check
pick_up[idx] = 1
dist_board = bfs(*taxi)
# ์น๊ฐ์ ๋ชฉ์ ์ง์ ๋์ฐฉ ๋๋ฌํ์๋์ง ํ์ธ
e_r, e_c = passengers[idx][2:]
cur_dist = dist_board[e_r][e_c] - 1
# ์ฐ๋ฃ๊ฐ ์๊ณ , ๋ฐฉ๋ฌธ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ค๋จ.
if fuel - cur_dist <= 0 or cur_dist == -1:
print(-1)
exit(0)
# ํ์์ ์์ ์์น๋ฅผ ์๋์ ๋ชฉ์ ์ง๋ก ๋ณ๊ฒฝ
taxi = [e_r, e_c]
# ์ด๋ํ ๊ฑฐ๋ฆฌ * 2 ๋งํผ ์ฐ๋ฃ๊ฐ ์ถฉ์ ๋จ.
# ์ฐ๋ฃ๋ฅผ ๊ฐ์์ํค์ง ์๊ณ ๋ํ๋ฉด ๋์ผํ ๊ฒฐ๊ณผ
fuel += cur_dist
if __name__ == '__main__':
N, M, fuel = map(int, stdin.readline().split())
board = [list(map(int, stdin.readline().split())) for _ in range(N)]
taxi = list(map(int, stdin.readline().split()))
# list index์ ๋ง๊ฒ 1์ฉ ๊ฐ์
taxi = [taxi[0] - 1, taxi[1] - 1]
passengers = [[0] for _ in range(M)]
pick_up = [0] * M
for idx in range(M):
s_r, s_c, e_r, e_c = map(int, stdin.readline().split())
# list index์ ๋ง๋๋ก 1์ฉ ๊ฐ์
passengers[idx] = [s_r - 1, s_c - 1, e_r - 1, e_c - 1]
dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))
for _ in range(M):
# 1. ํ์์ ์๋์ ๊ฑฐ๋ฆฌ ์ฐพ๊ณ , ์กฐ๊ฑด์ ์ ํฉํ ์น๊ฐ ์ฐพ๊ธฐ
cur_passenger = find_passenger()
# 2. ์๋ ๋ชฉ์ ์ง ๊น์ง ๋ฐ๋ ค๋ค ์ฃผ๊ธฐ
move_passenger(cur_passenger)
print(fuel)
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 19237 ์ด๋ฅธ ์์ด (0) | 2021.04.17 |
---|---|
๋ฐฑ์ค: 17779 ๊ฒ๋ฆฌ๋ฉ๋๋ง 2 (0) | 2021.04.16 |
๋ฐฑ์ค: 20058 ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (2) | 2021.04.14 |
๋ฐฑ์ค: 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด (0) | 2021.04.13 |
๋ฐฑ์ค: 14567 ์ ์๊ณผ๋ชฉ(Prerequisite) (0) | 2021.04.13 |