알고리즘/DFS & BFS

[백준] 14502 연구소

HJ39 2023. 5. 7. 22:18

문제를 해결하는 아이디어는 가장 넓은 안전 영역을 구하는 것이므로 벽을 설치한 후 바이러스를 퍼트려보고 완료된 그래프를 탐색하여 안전영역의 개수를 출력하면 되는 문제이다.

바이러스를 퍼트리고 안전영역을 찾는건 정말 쉬운 문제인데.. 이놈의 벽..!

 

해당 문제를 처음 딱 읽고 이해는 갔지만 이 벽이 문제였다.

벽 3개를 어떻게 배치를 할 것인가..

 

처음에 반복문을 이용하여 배치를 해보았지만 내 구현 능력이 부족한지 계속해서 실패하였다. ㅜㅜ

 

결국.. 인터넷의 힘을 빌릴 수 밖에..ㅠ

 

재귀를 이용하여 벽을 세우는데 약간 신기했다. (새로운 패턴 익히는 중)

 

□ 소스코드

#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> inputOrginal14502(9,vector<int>(9,0));
vector<vector<int>> input14502(9,vector<int>(9,0));
vector<pair<int, int>> virus14502;
int maxCount14502 = 0;

void copy14502(int N, int M){
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            input14502[i][j] = inputOrginal14502[i][j];
}

void bfs14502(int N, int M){
    copy14502(N, M);
    queue<pair<int, int>> q;
    
    for(int i=0;i<virus14502.size();i++)
        q.push({virus14502[i].first,virus14502[i].second});
    
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        
        int dx[] = {0,0,1,-1};
        int dy[] = {1,-1,0,0};
        
        for(int i=0;i<4;i++){
            int mx = dx[i] + x;
            int my = dy[i] + y;
            
            if(mx <1 || my <1 || mx > N || my > M)
                continue;
            
            if(input14502[mx][my] == 0 ){
                q.push({mx,my});
                input14502[mx][my] = 2;
            }
        }
    }
    
    int maxArange = 0;
    for(int i=1;i<=N;i++)
        for(int j=1; j<=M; j++)
            if(input14502[i][j] == 0)
                maxArange++;
    
    maxCount14502 = max(maxArange,maxCount14502);
}

void buildWall(int count,int N,int M){
    if(count == 0){
        bfs14502(N, M);
        return;
    }
    
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            if(inputOrginal14502[i][j] == 0 ){
                inputOrginal14502[i][j] = 1;
                count--;
                buildWall(count, N, M);
                count++;
                inputOrginal14502[i][j] = 0;
                
            }
        }
    }
    
}

void lab14502(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int N,M; cin>>N>>M;
    
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            int a; cin>>a;
            inputOrginal14502[i][j] = a;
            input14502[i][j] = a;
            if(a==2)
                virus14502.push_back({i,j});
        }
    }
    
    buildWall(3,N,M);
    bfs14502(N, M);
    
    cout<<maxCount14502<<endl;
}

'알고리즘 > DFS & BFS' 카테고리의 다른 글

[백준] 2468 안전영역  (0) 2023.05.07
[백준] 4963 섬의 개수  (0) 2023.05.07
[백준] 10026 적록색약  (0) 2023.05.07
[백준] 11724 연결 요소의 개수  (0) 2023.05.07
백준[2206] 벽 부수고 이동하기  (0) 2023.02.05