M<=치킨집갯수<=13 이니까 막 풀어도 시간이 괜찮을 것 같다!
최악의 경우 인데, 100,000 을 넘지 않는다.
파이썬의 조합 combination 라이브러리를 사용한다!
combinations(chicken_arr, m)) # 치킨집 중 m개를 조합으로 뽑느 ㄴ경우
from itertools import combinations
n, m = map(int, input().split())
# 이렇게 바둑판 전체를 한번에 입력받는게 아니라
#city = list(list(map(int, input().split())) for _ in range(n))
# 필요한 정보만 따로 리스트에 저장한다!
chicken, house = [], []
for r in range(n) :
data = list(map(int, input().split()))
for c in range(n) :
if data[c] == 1 :
house.append(r,c) # 일반 집
elif data[c] == 2 :
chicken.append(r,c) # 치킨집
# 모든 치킨집중에서 M개의 치킨집을 뽑는 조합 계산
candidates = list(combinations(chicken ,m))
def get_sum(candidate) :
result = 0
# 모든 집에 대하여
for hx, hy in house :
# 가장 가까운 치킨집 찾기
temp = 1e9
for cx, cy in candidate :
temp = min(temp, abs(hx-cx)+abs(hy-cy)) # 치킨 거리 계산
# 가장 가까운 치킨집가지의 거리를 더하기
result += temp
# 치킨 거리의 합 반환
return result
# 치킨 거리의 합의 최소를 찾아 출력
result = 1e9
for candidate in candidates :
result = min(result, get_sum(candidate))
print(result)
for hx, hy in house :
# 가장 가까운 치킨집 찾기
temp = 1e9
for cx, cy in candidate :
temp = min(temp, abs(hx-cx)+abs(hy-cy)) # 치킨 거리 계산
# 가장 가까운 치킨집가지의 거리를 더하기
result += temp
# 치킨 거리의 합 반환
return result