๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2583 ์˜์—ญ ๊ตฌํ•˜๊ธฐ DFS

by Jouureee 2021. 4. 22.

๋ฌธ์ œ: 

www.acmicpc.net/problem/2583

 

2583๋ฒˆ: ์˜์—ญ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— M๊ณผ N, ๊ทธ๋ฆฌ๊ณ  K๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. M, N, K๋Š” ๋ชจ๋‘ 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ K๊ฐœ์˜ ์ค„์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ x, y์ขŒํ‘œ๊ฐ’๊ณผ ์˜ค

www.acmicpc.net

 

๋ถ„์„ :

์ „ 2667(๋‹จ์ง€ ๋ฒˆํ˜ธ ๋ถ™์ด๊ธฐ)๋ฒˆ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ด๋‚˜ ์ฃผ์–ด์ง€๋Š” ์ž…๋ ฅ๊ฐ’์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค !

๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ๊ณผ ์˜ค๋ฅธ์ชฝ ์œ„ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ์ด์—๋”ฐ๋ผ ๊ฐ€์ง€๋Š” ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๊ตฌํ•ด ์‚ฌ๊ฐํ˜•์„ 1๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ ์ฃผ์—ˆ๋‹ค.

 

 

๊ทธ๋Ÿฌ๋ฉด ๋‚จ์€ map์˜ ์ขŒํ‘œ๋Š” 0์ด ๋ ๊บผ๊ณ  dfs๋ฅผ ๋Œ๋ฉฐ ๋งต์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋˜ dfs_all๋กœ ๋Š์–ด์ ธ ์žˆ๋Š” ๊ณณ๋“ค์— ๋Œ€ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค!

 

c++ ์ฝ”๋“œ :

//
//  2583_domain.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/20.
//

#include <stdio.h>
#include <iostream>
#include <vector>
#include <string.h>
#include <stack>
#include <algorithm>

#define MAX 101

bool map[MAX][MAX];
int cmap[MAX][MAX];
bool visit[MAX][MAX];
int M, N, K;

using namespace std;


int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };
int dfs(pair<int, int> start){
    int count = 1;
    visit[start.first][start.second] = true;
    stack<pair<int, int>> s;
    s.push(make_pair(start.first, start.second));
    while(!s.empty()){//stack s๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์„ ๋™์•ˆ
        int x = s.top().first;
        int y = s.top().second;
        // << x << " " << y << endl;
        s.pop();
        for(int i = 0; i < 4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx >= 0 && ny >= 0 && nx < M && ny < N){
                if(visit[nx][ny] == false && cmap[nx][ny] == 0){ // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ  ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด๋ผ๋ฉด
                    visit[nx][ny] = true; // ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์„ ํŒ๋ณ„
                    count++;
                    s.push(make_pair(nx, ny));
                }
            }
        }
    }
    return count;
    
}

  
void dfsAll(){
    vector<int> ans;
    memset(visit, false, sizeof(visit));
    
    pair<int, int> start;
    
    for(int i = 0; i < M; i++){
        for(int j = 0; j < N; j++){
            if (cmap[i][j] == 0 && visit[i][j] == false){
                start = make_pair(i, j);
                int cnt = dfs(start);
                ans.push_back(cnt);
            
            }
        }
    }
    sort(ans.begin(), ans.end());
    cout << (int)ans.size() << endl;

    for(int i = 0; i < (int)ans.size(); i++){
        cout << ans.at(i) << " ";
    }
    
}
    


int main(){

    int x, y;
    cin >> M >> N >> K;
    vector<pair<int, int>> temp[K];
    
    for(int i = 0; i < K; i++){
        for(int j = 0; j < 2; j++){
            cin >> x >> y;
            temp[i].push_back(make_pair(M - y, x));
        }
    }
    
//    for(int i = 0; i < K; i++){
//        for(int j = 0; j < (int)temp[i].size(); j++){
//            cout << temp[i][j].first << " " << temp[i][j].second << " ";
//        }
//        cout<< endl;
//    }
    
    //map ์ดˆ๊ธฐํ™”
    for(int i =0; i < M + 1; i++){
        for(int j = 0; j < N + 1; j++){
            map[i][j] = 0;
        }
    }
    
    for(int i = 0; i < K; i++){ //3
        pair<int, int> leftEnd = temp[i][0];
        pair<int, int> rightTop = temp[i][1];
        
        int nx = leftEnd.first;
        while(nx > rightTop.first){
            int ny = leftEnd.second;
            while(ny < rightTop.second){
                map[nx][ny] = 1;
                if (ny < rightTop.second){
                    ny+= 1;
                    //cout << nx << " " << ny << endl;
                }
            }
            ny--;
            map[nx--][ny]= 1;
        }
    }
    
        for(int i =1; i < M + 1; i++){
            for(int j = 0; j < N; j++){
                cout << map[i][j] << " ";
            }
            cout << endl;
        }
    
        
    for(int i =1; i < M + 1; i++){
        for(int j = 0; j < N; j++){
            cmap[i-1][j] = map[i][j];
        }
    }
    
//    for(int i = 0; i < M; i++){
//        for(int j = 0; j < N; j++){
//            cout << cmap[i][j] <<" " ;
//        }
//        cout << endl;
//    }
    


    dfsAll();

    return 0;
    
}

๋Œ“๊ธ€