ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 15686] 치킨 배달
    백준/DFS and 백트래킹 2023. 7. 5. 13:57

    + 24.8.17 다시 품

     

    더 빨라졌다ㅎㅎ

     


    그냥 일반적인 조합론 문제이다

    집이랑 치킨집의 좌표에 대한 정보를 희소행렬로 저장해주고

    조합따지기 위해 재귀 돌리다가 치킨집이 M개가 모였을때의 계산로직만 짜주면 된다

     


    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <bitset>
    
    #define SIZE 13
    #define INF (int)1e9
    
    using namespace std;
    
    int N, M;
    vector<pair<int, int>> chicken;
    vector<pair<int, int>> home;
    bitset<SIZE> visited;
    
    int ans = INF;
    
    void solve(int start, bitset<SIZE> visited) {
    
    	// M개일때 종료
    	if (visited.count()==M) {
    		int dis = 0;
    		int cy, cx, hy, hx;
    		int nearest, cur;
    
    		// 모든 집들마다
    		for (int i = 0; i < home.size(); i++) {
    			hy = home[i].first;
    			hx = home[i].second;
    
    			// 제일 가까운 치킨집찾아서 거리 더해주기
    			nearest = INF;
    			for (int k = 0; k < visited.size(); k++) {
    				
    				if (visited[k] == 0) continue;
    
    				cy = chicken[k].first;
    				cx = chicken[k].second;
    
    				cur = abs(cy - hy) + abs(cx - hx);
    
    				if (nearest > cur) nearest = cur;
    			}
    			dis += nearest;
    		}
    
    		if (ans > dis) ans = dis;
    
    		return;
    	}
    
    	// 조합이므로 바로 뒤에꺼부터 탐색
    	for (int i = start + 1; i < chicken.size(); i++) {
    		visited[i] = 1;
    		solve(i, visited);
    		visited[i] = 0;
    	}
    }
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	cin >> N >> M;
    	
    	int x;
    	for (int i = 1; i <= N; i++) {
    		for (int k = 1; k <= N; k++) {
    			cin >> x;
    			if (x == 1) home.push_back(make_pair(i, k));
    			else if (x == 2) chicken.push_back(make_pair(i, k));
    		}
    	}
    
    	solve(-1, visited);
    
    	cout << ans;
    
    	return 0;
    }

    '백준 > DFS and 백트래킹' 카테고리의 다른 글

    [백준 1759] 암호 만들기  (2) 2023.07.07
    [백준 15649] N과 M(1) 순열  (1) 2023.07.07
    [백준 16437] 양 구출 작전  (0) 2023.06.30
    [백준 1987] 알파벳  (1) 2023.05.16
    [백준 2667] 단지번호붙이기  (0) 2023.05.13