[문제 링크]

 

15686번: 치킨 배달

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

www.acmicpc.net


이 문제는 도시 좌표 전체를 배열에 담을 필요 없이 치킨집(2)과 가정집(1) 좌표만 골라서 따로 선언한 배열에 담아주면 쉽게 풀 수 있다.

치킨집 배열에서 M개 치킨집을 살리는 경우를 구한다음, 모든 경우에 따른 치킨거리를 계산하여 최솟값을 출력하면 원하는 결과를 얻을 수 있다.


#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
 
const int INF = 987654321;
vector<pair<intint>> housePos;
vector<pair<intint>> chickenPos;
vector<int> ckPick;
int ckCnt;
int bestCityDist = INF;
int min(int a, int b) { return a < b ? a : b; }
void ChickenDistance()
{
    int houseLen = housePos.size();
    int cityDist = 0;
    for (int i = 0; i < houseLen; i++)
    {
        int minDistance = INF;
        for (int j = 0; j < ckCnt; j++)
        {
            int yDist = abs(housePos[i].first - chickenPos[ckPick[j]].first);
            int xDist = abs(housePos[i].second - chickenPos[ckPick[j]].second);
            minDistance = min(minDistance, yDist + xDist);
        }
        cityDist += minDistance;
    }
 
    bestCityDist = min(bestCityDist, cityDist);
}
 
void Solution(int start, int pick)
{
    if (pick == ckCnt)
    {
        ChickenDistance();
        return;
    }
    int ckLen = chickenPos.size();
    for (int i = start; i < ckLen; i++)
    {
        ckPick.push_back(i);
        Solution(i + 1, pick+1);
        ckPick.pop_back();
    }
}
int main(void)
{
    int maxLen;
    cin >> maxLen >> ckCnt;
    for (int i = 0; i < maxLen; i++)
        for (int j = 0; j < maxLen; j++)
        {
            int n;
            cin >> n;
            if(n==1)housePos.push_back(pair<intint>(i, j));
            if(n==2)chickenPos.push_back(pair<int,int>(i, j));
        }
    Solution(00);
    cout << bestCityDist << endl;
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

알고리즘 200일 프로젝트 - 10day

내일도 열심히!

'알고리즘 > BOJ' 카테고리의 다른 글

백준 15683번: 감시 (C++)  (0) 2020.04.18
백준 1065번: 한수  (0) 2020.04.17
백준 14500번: 테트로미노 (C++)  (0) 2020.04.15
백준 14889번: 스타트와 링크  (0) 2020.04.14
백준 1018번: 체스판 다시 칠하기  (0) 2020.04.13

+ Recent posts