์ต๊ทผ ์๊ณ ๋ฆฌ์ฆ ๋ํ ๋ฑ์ ๋๊ฐ์ ๋ ์ด๋ ค์ด ๋ฌธ์ ๋ฅผ ์์๋ณด๋๊ฒ์ ๋ํ ์ค์์ฑ์ ๋๊ผ์๋ค. ๊ทธ๋์ ๋ฐฑ์ค ๋ฌธ์ ๋ณ ๋ฑ๊ธํ์๋ฅผ ๊บผ๋๋๋... ์ด ๋ฌธ์ ๊ฐ ๊ฑธ๋ ธ๋ค... ์ข์๊ฑด์ง ์์ข์๊ฑด์ง...
๋ฌธ์
https://www.acmicpc.net/problem/4991
๋ฌธ์ ์ดํด
- w x h ์ ๊ฒฉ์ํ์ด ์ฃผ์ด์ง
- ๋ก๋ด์ฒญ์๊ธฐ๊ฐ ๊ฐ๊ตฌ๋ฅผ ํผํด ๋๋ฌ์ด ๊ณณ์ ์ฒญ์
- ๋๋ฌ์ด ์นธ์ ๋ชจ๋ ์ฒญ์ํ์ ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋? -> ์ธํ์ ์ํ ๋ฌธ์ ์ด๋ค. ์๋ง ์ด์ ์ ํ์๋ 2098๋ฒ๊ณผ ๋น์ทํ ๋ฏ..
- ๋๋ฌ์ด ์นธ์ 10๊ฐ ์ดํ -> ๋นํธ๋ง์คํน์ DP ์ธ๋ฑ์ค์ ์ฌ์ฉํ๋ค (๋ฐฉ๋ฌธํ ์ํฉ, ์ง์ ๋ฐฉ๋ฌธํ ์์น)
์ฝ๋ ์ค๋ช
- ์ผ๋จ ๋๋ฌ์ด ์นธ์ ์ ๋ถ ๋ชจ์๋๊ณ ๊ฐ๊ฐ์ ์์์ผ๋ก bfs๋ฅผ ๋๋ฆฐ๋ค
- ๊ฐ ์นธ์์ ๋ค๋ฅธ ์นธ์ผ๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋์ ๋๋ฆฌ๋ก ์ ์ฅํด๋์.
- ๋ง์ฝ bfs ๋๋ ธ์๋ -1์ด ๋์๋ค๋ฉด? ์ด๋ป๊ฒ์๋ ์ ๊ทผํ ์ ์๋ ์นธ์ด ๋์จ ๊ฒ -> return -1๋ก ๋๋ธ๋ค.
-> dist_remove๋ {0:{1:2,2:4,3:4,4:5,...},{},..} ์ด๋ฐ ์์ผ๋ก 0์์ ์ถ๋ฐํด 3์ผ๋ก ๊ฐ๋๊ฑด ๊ฑฐ๋ฆฌ 4.
=> ๋๋ฌ์ด ์นธ์ ์ฌ์ด ๊ฑฐ๋ฆฌ๋ค์ ์ ๋ถ ๊ตฌํ ์ ์๋ค. (dist_remove)
- ๊ทธ ๋ค์์ DP๋ก ์ ๋ถ ๋ฐฉ๋ฌธํ์๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
- dp [์ฒญ์ํด์ผํ๋ ์นธ์ ์๋งํผ 2์ ์ ๊ณฑ] [์ฒญ์ํด์ผํ๋ ์นธ์ ์ <-์ง์ ์ฒญ์ํ๊ณณ] = ์ ๋ถ INF
- ๊ฐฑ์ ํด๊ฐ๋ฉด์ ์ต์ข
์ ์ผ๋ก ์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํจ.
dp[mask | (1 << v)][v] = min( dp[mask | (1 << v)][v], dp[mask][u] + dist_remove[u][v] )
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
import sys
from collections import deque
input = sys.stdin.readline
dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]
def valid(x, y):
return 0 <= x < h and 0 <= y < w
def bfs(start):
dist = [[-1] * w for _ in range(h)]
queue = deque([start])
dist[start[0]][start[1]] = 0
while queue:
x, y = queue.popleft()
for dx, dy in dir:
xx, yy = x + dx, y + dy
if valid(xx, yy) and G[xx][yy] != "x" and dist[xx][yy] == -1:
dist[xx][yy] = dist[x][y] + 1
queue.append((xx, yy))
return dist
def solve(w, h):
dirty_box = []
start = None
for i in range(h):
for j in range(w):
if G[i][j] == "*":
dirty_box.append((i, j))
elif G[i][j] == "o":
start = (i, j)
dirty_box.insert(0, start)
remove_num = len(dirty_box)
dist_remove = [[0] * remove_num for _ in range(remove_num)]
for i in range(remove_num):
sx, sy = dirty_box[i]
short_paths = bfs((sx, sy)) # i ์ถ๋ฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ค
for j in range(remove_num): # i์ j ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ค
if i != j:
tx, ty = dirty_box[j]
if short_paths[tx][ty] == -1:
return -1
dist_remove[i][j] = short_paths[tx][ty]
# DP
INF = float("inf")
dp = [[INF] * remove_num for _ in range(1 << remove_num)] # ๋นํธ๋ง์คํน
dp[1][0] = 0
#dirty_box์ ์ฒซ๋ฒ์งธ๋ ์คํํธ์์น. 0000...01. ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ ํ์ฌ ์ํ. ๋๋ฒ์ฌ ์ธ๋ฑ์ค๋ ๊ทธ ์ ์ ์์น
for mask in range(1 << remove_num):
for u in range(remove_num):
if mask & (1 << u): # u ๋ฐฉ๋ฌธํจ
for v in range(remove_num):
if not (mask & (1 << v)): # v๋ ๋ฐฉ๋ฌธ์ํจ -> u ํ v๋ฅผ ๋ฐฉ๋ฌธํ ๋
dp[mask | (1 << v)][v] = min(
dp[mask | (1 << v)][v], dp[mask][u] + dist_remove[u][v]
)
result = INF
final_mask = (1 << remove_num) - 1
for i in range(1, remove_num):
result = min(result, dp[final_mask][i])
return result if result != INF else -1
ans = []
while True:
w, h = map(int, input().split())
if w == 0 and h == 0:
break
G = [list(input().strip()) for _ in range(h)]
ans.append(str(solve(w, h)))
print("\n".join(ans))
|
cs |
'Coding > ๋ฐฑ์ค ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| (์๋ฐ) ๋ฐฑ์ค 7420๋ฒ : ๋งน๋ ๋ฐฉ๋ฒฝ (0) | 2026.01.20 |
|---|---|
| (JAVA) ๋ฐฑ์ค 3197๋ฒ : ๋ฐฑ์กฐ์ ํธ์ (0) | 2024.10.07 |
| (JAVA) ๋ฐฑ์ค 3085๋ฒ : ์ฌํ ๊ฒ์ (0) | 2024.03.12 |
| (JAVA) ๋ฐฑ์ค 10026๋ฒ : ์ ๋ก์์ฝ (0) | 2023.04.03 |
| (ํ์ด์ฌ) ๋ฐฑ์ค 2839๋ฒ : ์คํ ๋ฐฐ๋ฌ (0) | 2022.07.21 |
Comment