본문 바로가기
Problem Solving/BOJ

[Python] 15686. 치킨 배달

by 부르르 2021. 4. 8.

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

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net


순열로 완전탐색하여 도시 치킨거리를 구한다.

def next_perm(a):
    i = len(a)-1
    while i > 0 and a[i-1] >= a[i]:
        i -= 1
    if i <= 0:
        return False
    j = len(a)-1
    while a[i-1] >= a[j]:
        j -= 1
    a[i-1], a[j] = a[j], a[i-1]
    j = len(a)-1
    while i < j:
        a[i], a[j] = a[j], a[i]
        i += 1
        j -= 1
    return True

N, M = map(int, input().split())
MAP = [list(map(int, input().split())) for _ in range(N)]

house = []
chicken = []

for y in range(N):
    for x in range(N):
        if MAP[y][x] == 1:
            house.append((y,x))
        elif MAP[y][x] == 2:
            chicken.append((y,x))

opt = [0]*(len(chicken)-M) + [1]*M
answer = 10**10

while True:
    candidate = []
    for i in range(len(chicken)):
        if opt[i] == 1:
            candidate.append(chicken[i])
    total_dist = 0
    for h in house:
        dist = []
        for c in candidate:
            dist.append(abs(h[0]-c[0])+abs(h[1]-c[1]))
        total_dist += min(dist)
    answer = min(total_dist, answer)

    if not next_perm(opt):
        break

print(answer)

 

문제를 푸는데 도움이 된 테스트 케이스

 

 

728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python] 16235. 나무 재테크  (0) 2021.04.15
[Python] 14503. 로봇 청소기  (0) 2021.04.14
[Python] 14499. 주사위 굴리기  (0) 2021.04.07
[Python] 13458. 시험 감독  (0) 2021.04.04
[Python] 3190. 뱀  (0) 2021.04.03

댓글