๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 15686๋ฒˆ - ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

by ์•ˆ์ฃผํ˜• 2022. 8. 26.

๋ฌธ์ œ

 

15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <memory.h>
#include <algorithm>
#define INF 1e9
using namespace std;


int N, M;
int map[51][51];
vector<pair<int,int>> store;    // ์น˜ํ‚จ์ง‘ ์ขŒํ‘œ
bool is_store[51][51];  // ํ์—…ํ•˜์ง€ ์•Š์€ ์น˜ํ‚จ์ง‘์ธ์ง€ ์œ ๋ฌด
int house_store_dist[51][51];  // ํ•ด๋‹น ์ง‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ
int ans = INF;

void dist(){    // ์ง‘๊ณผ ์น˜ํ‚จ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            if(map[i][k] == 1){    // ์ง‘์ผ๋•Œ
                for(auto it : store){
                    if(is_store[it.first][it.second] == 1){ // ํ์—…ํ•˜์ง€ ์•Š์€ ์น˜ํ‚จ ์ง‘์ผ ๋•Œ
                        int dist = abs(it.first - i) + abs(it.second - k);
                        house_store_dist[i][k] = min(house_store_dist[i][k], dist); // ์ตœ์†Œ ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
                    }
                }
            }
        }
    }
}

void check_min_dist(){
    int ans_temp = 0;
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            if(map[i][k] == 1) ans_temp += house_store_dist[i][k];
        }
    }
    ans = min(ans_temp, ans);
}


void backtraking(int idx, int is_store_cnt){
    if(is_store_cnt>M) return;    // ์ดค๋Œ€ ํ์—… ๊ฐ€๋Šฅ ์ˆ˜ ๋ณด๋‹ค ๋” ๋งŽ์ด ํ์—…ํ–ˆ์„ ๋•Œ return
    if(is_store_cnt>0){
        dist();
        check_min_dist();
    }
    
    for(int i = idx; i<store.size(); i++){
        int r = store[i].first;
        int c = store[i].second;
        
        is_store[r][c] = 1; // ํ์—…ํ•˜์ง€ ์•Š์€ ์น˜ํ‚จ์ง‘
        int backup[51][51] = {};
        memcpy(backup, house_store_dist, sizeof(house_store_dist));
        backtraking(i+1, is_store_cnt+1);
        memcpy(house_store_dist, backup, sizeof(backup));
        is_store[r][c] = 0; // ํ์—…ํ•œ ์น˜ํ‚จ์ง‘
    }
    
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>N>>M;
    
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            cin>>map[i][k];
            if(map[i][k] == 2) store.push_back({i, k});
        }
    }
    for(int i=0; i<51; i++) fill(house_store_dist[i], house_store_dist[i]+51, INF);
    backtraking(0, 0);
    cout<<ans;
}

 

ํ’€์ด

0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 1 2

์œ„์™€ ๊ฐ™์€ ๋„์‹œ๊ฐ€ ์žˆ์„ ๋•Œ 1์€ ๊ฐ€์ •์ง‘, 2๋Š” ์น˜ํ‚จ์ง‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

์œ„ ๋„์‹œ์—์„œ ํ์—…์‹œํ‚ค์ง€ ์•Š์„ ์น˜ํ‚จ์ง‘์„ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณจ๋ž์„ ๋•Œ, ๊ทธ ํ์—…์‹œํ‚ค์ง€ ์•Š์€ ์น˜ํ‚จ์ง‘๊ณผ ๊ฐ ๊ฐ€์ •์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ์˜ ๊ฐ๊ฐ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ „๋ถ€ ๋”ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ์น˜ํ‚จ์ง‘์˜ ์œ„์น˜๋ฅผ ์ „๋ถ€ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ , ๊ฐ ์น˜ํ‚จ์ง‘์˜ M๊ฐœ ์ดํ•˜๋งŒํผ ๋ฐฑํŠธ๋ž˜ํ‚น ์กฐํ•ฉ์„ ํ†ตํ•ด ๊ณ ๋ฅธ ํ›„, ๊ทธ๋•Œ๋งˆ๋‹ค ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋Š๋‚Œ์ด ๋“œ๋Š” ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•œ๋ฐ, ์กฐํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€