설명없음

백준 2636: 치즈 [C/C++], 삼성 코딩 테스트

치킨먹고싶어요 2022. 6. 13. 13:53

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

 

2636번: 치즈

첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진

www.acmicpc.net

#include <iostream>
using namespace std;
 
int N, M;
int dy[4= { 010-1 };
int dx[4= { 10-10 };
int cheese[111][111];
int tmp[111][111];
bool visited[111][111];
void dfs(int y, int x) {
    for (int i = 0; i < 4; i++) {
        if (y + dy[i] < 1 || y + dy[i] > N || x + dx[i] < 1 || x + dx[i] > M) continue;
        if (visited[y + dy[i]][x + dx[i]]) continue;
        visited[y + dy[i]][x + dx[i]] = true;
        if (!cheese[y + dy[i]][x + dx[i]]) dfs(y + dy[i], x + dx[i]);
        else tmp[y + dy[i]][x + dx[i]] = 1;
    }
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> N >> M;
    int cnt = 0int removed = 0int last = 0;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> cheese[i][j]; 
            if (cheese[i][j]) cnt++;
        }
    }
    int c = 0;
    while (cnt != 0) {
        c++;
        removed = 0;
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= M; j++) {
                visited[i][j] = false;
                tmp[i][j] = 0;
            }
        }
        dfs(11);
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= M; j++) {
                if (tmp[i][j]) {
                    cheese[i][j] = 0;
                    removed++;
                }
            }
        }
        last = removed;
        cnt -= removed;
    }
    cout << c << "\n" << last;
}
 
 
cs