15686 치킨 배달
본문 바로가기
알고리즘 모음집/New 알고리즘

15686 치킨 배달

by KyeongMin 2021. 3. 16.
728x90
반응형

www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

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

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
#define NS 51//배열 최대 크기
int N, M;//배열크기, 치킨 뽑는수;
struct Pos {
	int y; int x;
};
vector<Pos>H;//집 정보
vector<Pos>C;//치킨 정보
vector<int>D;//뽑는 치킨
int ret;//최소 값
void dfs(int idx, int cnt) {
	if (idx == C.size()+1)return;
	if (cnt == M) {
		//C
		int sum = 0;//최소의 합 저장
		for (int h = 0; h < H.size(); h++) {
			int minDistance = 0x7fffffff;//최소
			for (int d = 0; d < D.size(); d++) {
				int distance = abs(H[h].y - C[D[d]].y) + abs(H[h].x - C[D[d]].x);
					minDistance = minDistance >distance ? distance : minDistance;
			}
			sum += minDistance;
		}// for int h
		ret = ret > sum ? sum : ret;//최종 최소 저장
		return;
	}
	D.push_back(idx);
	dfs(idx + 1, cnt + 1);
	D.pop_back();
	dfs(idx + 1, cnt);
}
void init() {//초기화 및 초기 입력
	N = M = 0;
	ret = 0x7fffffff;
	H.clear(); C.clear(); D.clear();
	scanf("%d %d", &N, &M);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			int num = 0;
			scanf("%d", &num);//정보
			if (1==num) H.push_back({ i,j });//집정보
			if (2==num)C.push_back({ i,j });//치킨 정보
		}
	}
}
int main(void) {
	int testCase = 1;//테스트 케이스
	//scanf("%d", &testCase);
	for (int tc = 1; tc <= testCase; tc++) {
		init();
		dfs(0, 0);
		//printf("#%d %d\n", tc, ret);
		printf("%d\n",ret);
	}
	return 0;
}

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

15683 감시  (0) 2021.03.19
14502 연구소(리팩토링)  (0) 2021.03.19
14500 테트로미노  (0) 2021.03.16
14503 로봇 청소기  (0) 2021.03.15
14499 주사위 굴리기  (0) 2021.03.15

댓글