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

[๋ฐฑ์ค€,c++] 17141๋ฒˆ - ์—ฐ๊ตฌ์†Œ 2

by ์•ˆ์ฃผํ˜• 2022. 5. 27.

๋ฌธ์ œ

 

17141๋ฒˆ: ์—ฐ๊ตฌ์†Œ 2

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์— ์Šน์›์ด๊ฐ€ ์นจ์ž…ํ–ˆ๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์œ ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์Šน์›์ด๋Š” ์—ฐ๊ตฌ์†Œ์˜ ํŠน์ • ์œ„์น˜์— ๋ฐ”์ด๋Ÿฌ์Šค M๊ฐœ๋ฅผ ๋†“์„ ๊ฒƒ์ด๊ณ , ์Šน์›์ด์˜ ์‹ ํ˜ธ์™€ ๋™์‹œ์— ๋ฐ”์ด

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <memory.h>
#include <algorithm>
#include <map>
using namespace std;


int N, M;
int maps[51][51], cpy[51][51];
vector<pair<int,int>>virus;
vector<vector<pair<int,int>>>pick_virus;


int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
int ans = 1e9;

void ncr(int index, vector<pair<int,int>>pick, int cnt){    //์กฐํ•ฉ
    if(cnt==M){
        pick_virus.push_back(pick);
    }
    for(int i=index; i<virus.size(); i++){
        int x = virus[i].first;
        int y = virus[i].second;
        pick.push_back({x,y});
        ncr(i+1, pick, cnt+1);
        pick.pop_back();
    }
}


void bfs(){
    queue<pair<int,int>>q;
    int time_check[51][51] = {0, };
    
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            if(cpy[i][k]==2){
                q.push({i,k});
            }
        }
    }
    
    
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        
        for(int i=0; i<4; i++){
            int nx = x+dx[i];
            int ny = y+dy[i];
            if(nx>=0&&nx<N&&ny>=0&&ny<N){
                if(cpy[nx][ny]==0){
                    q.push({nx,ny});
                    time_check[nx][ny] = time_check[x][y] + 1;
                    cpy[nx][ny] = 2;
                }
            }
        }
    }
    
    bool flag = true;
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            if(cpy[i][k]==0) flag = false;
        }
    }
    
    if(flag){
        int temp = -1;
        for(int i=0; i<N; i++){
            for(int k=0; k<N; k++){
                temp = max(temp, time_check[i][k]);
            }
        }
        ans = min(ans, temp);
    }
}

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>>maps[i][k];
            if(maps[i][k]==2){
                virus.push_back({i,k});
                maps[i][k] = 0;
            }
        }
    }
    
    ncr(0,{},0);
    
    for(int i=0; i<pick_virus.size(); i++){
        memcpy(cpy, maps, sizeof(maps));
        
        for(int k=0; k<pick_virus[i].size(); k++){
            int x = pick_virus[i][k].first;
            int y = pick_virus[i][k].second;
            cpy[x][y] = 2;
        }
        
        bfs();
    }
    
    if(ans==1e9) cout<<-1;
    else cout<<ans;
    
}

 

ํ’€์ด

BFS + ์กฐํ•ฉ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. 

๋จผ์ € ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋†“์ผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ „๋ถ€ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์–ตํ•œ ๋ฐ”์ด๋Ÿฌ์Šค ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ๋†“์•„๊ฐ€๋ฉฐ ์ผ๋ฐ˜์ ์ธ BFSํƒ์ƒ‰์„ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ํ…Œ์ด๋ธ”์„ ๋”ฐ๋กœ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

์กฐํ•ฉ์„ ์ด์šฉํ•˜์—ฌ BFS ํƒ์ƒ‰ํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ฒ˜์Œ ํ’€์–ด๋ณธ ๊ฒƒ ๊ฐ™์€๋ฐ ์—ฐ๊ตฌ์†Œ1, 2, 3 ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ์ฐธ ์งˆ ์ข‹์€ ๋ฌธ์ œ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€