- 일단 피자집 M개가 선택되어야 하는 상황이니 조합을 생각했어야 한다! 예를 들어, 6개 중 4개만 뽑는다 하면 DFS를 사용하여 4가지만 뽑는 경우의 수를 구할 수 있다
- 그리고 뽑아진 M개의 피자집을 가지고 집들을 모두 for문을 이용하여 돌면서 하나의 집당 어떤 피자집과 가장 최소거리를 갖는지 찾은 후, 그 거리들을 모두 더하면 최소 피자배달거리가 나온다
- 나온 최소 피자배달거리도 조합에 따라 모두 다를 것이다. 그 중에 가장 최소값을 찾으면 되는 문제인 것이다
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
|
def DFS(level, start):
global res
if level == m:
sum = 0
for i in range(len(house)):
x, y = house[i][0], house[i][1]
dist = 2147000000
for z in combination:
x2, y2 = pizza[z][0], pizza[z][1]
dist = min(dist, abs(x-x2) + abs(y-y2))
sum += dist
if sum < res:
res = sum
else:
for j in range(start, len(pizza)):
combination[level]=j
DFS(level+1, j+1)
if __name__=='__main__':
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
pizza = []
house = []
combination = [0]*m
res = 2147000000
for i in range(n):
for j in range(n):
if board[i][j]==2:
pizza.append((i,j))
elif board[i][j]==1:
house.append((i,j))
DFS(0, 0)
print(res)
|
cs |
728x90
'Data Structures & Algorithms' 카테고리의 다른 글
[Algorithms] 동적 계획법(Dynamic Programming)-최대 부분 증가수열 (0) | 2022.06.07 |
---|---|
[Algorithms] 동적 계획법(Dynamic Programming)-돌다리 건너기(Bottom-Up) (0) | 2022.06.07 |
[Algorithms] 깊이/넓이 우선 탐색 (DFS, BFS) 활용-사다리 타기(DFS, BFS 2가지 방법으로) (0) | 2022.06.05 |
[Algorithms] 깊이/넓이 우선 탐색 (DFS, BFS) 활용-토마토 (BFS 활용) (0) | 2022.06.05 |
[Algorithms] 깊이/넓이 우선 탐색 (DFS, BFS) 활용-안전 영역 (DFS, BFS 2가지 방법으로) (0) | 2022.06.05 |