티스토리 뷰

https://www.acmicpc.net/problem/2636

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

맵의 가장자리에서 DFS를 수행하여 풀이했습니다.

이를 통해 치즈 내부에 있는 빈 공간은 그대로 두고, 가장자리와 맞닿아 있는 치즈의 갯수를 알 수 있습니다.


C++ 소스 코드

#include <iostream>
#include <string>
#define MAX 101
using namespace std;
const int dx[]= {0,0,-1,1}, dy[]= {-1,1,0,0};
int maps[MAX][MAX];
bool visit[MAX][MAX];
int n,m;
void dfs(int x, int y){
    visit[x][y] = true;
    for(int i=0;i<4;i++){
        int nx = x+dx[i], ny = y+dy[i];
        if (nx <0 || nx >= n || ny < 0 || ny>=m) continue;
        if(visit[nx][ny]) continue;
        if(maps[nx][ny]==1){
            maps[nx][ny] = 2;
        }else if(maps[nx][ny]==0 ){
            dfs(nx,ny);
        }
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int cnt = 0;
    cin >> n >> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >> maps[i][j];
            if(maps[i][j]==1) cnt++;
        }
    }
    int time = 1;
    while(true){
        fill(&visit[0][0], &visit[n][m]+1,0);
        for(int i=0;i<n;i++){
            if(maps[i][0]== 0 && !visit[i][0]){
                dfs(i,0);
            }
            if(maps[i][m-1]== 0 && !visit[i][m-1]){
                dfs(i,m-1);
            }
        }
        for(int i=0;i<m;i++){
            if(maps[0][i]== 0 && !visit[0][i]){
                dfs(0,i);
            }
            if(maps[n-1][i]== 0 && !visit[n-1][i]){
                dfs(n-1,i);
            }
        }
        int tmp = 0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if (maps[i][j]== 2){
                    maps[i][j]=0;
                    tmp++;
                }

            }
        }
        if(tmp == cnt){
            break;
        }
        cnt-=tmp;
        time++;
    }
    cout << time << '\n';
    cout << cnt << '\n';
    return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함