chldkato

백준 15686 치킨 배달 (파이썬) 본문

백준

백준 15686 치킨 배달 (파이썬)

chldkato 2020. 4. 14. 15:22

https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는

www.acmicpc.net

1. 집과 치킨집의 좌표를 home, chicken에 저장한다

2. 1부터 m까지 치킨집을 dfs로 구현한 조합으로 선택한다

3. 집으로부터 선택한 치킨집의 거리 중 최소값을 dist에 저장한다

4. dist의 합은 현재 선택한 치킨집의 치킨 거리이다. 따라서 dist 중 최소값을 출력

import sys

input = sys.stdin.readline

def length(dist):
    for i in range(len(home)):
        h_x, h_y = home[i]
        for j in range(len(c)):
            if c[j]:
                c_x, c_y = chicken[j]
                d = abs(h_x - c_x) + abs(h_y - c_y)
                dist[i] = min(d, dist[i])
    return sum(dist)

def comb(idx, cnt, r):
    global ans
    if cnt == r:
        dist = [sys.maxsize for _ in range(len(home))]
        ans = min(length(dist), ans)
        return

    for i in range(idx, len(chicken)):
        if c[i]:
            continue
        c[i] = 1
        comb(i + 1, cnt + 1, r)
        c[i] = 0

n, m = map(int, input().split())
a, chicken, home = [], [], []
for i in range(n):
    row = list(map(int, input().split()))
    a.append(row)
    for j in range(n):
        if a[i][j] == 1:
            home.append([i, j])
        if a[i][j] == 2:
            chicken.append([i, j])

c = [0 for _ in range(len(chicken))]
ans = sys.maxsize
for r in range(m):
    comb(0, 0, r+1)
print(ans)

'백준' 카테고리의 다른 글

백준 15684 사다리 조작 (파이썬)  (0) 2020.04.15
백준 15685 드래곤 커브 (파이썬)  (0) 2020.04.14
백준 5373 큐빙 (파이썬)  (0) 2020.04.14
백준 5213 과외맨 (파이썬)  (0) 2020.04.12
백준 2186 문자판 (파이썬)  (0) 2020.04.10
Comments