본문 바로가기
백준 알고리즘/구현

치즈 C++

by paysmile 2022. 3. 7.

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

 

2636번: 치즈

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

www.acmicpc.net

#include <iostream>
#include <cstring>

using namespace std;
struct MOVE { int x, y; };
MOVE mv[4] = { {1,0}, {-1,0}, {0,1}, {0,-1} };
const int MAX = 101;
int map[MAX][MAX];
int n, m;
int visited[MAX][MAX];
int ans;
int answer = 0;

bool isEmpty() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (map[i][j] == 1) {
				return true;
			}
		}
	}

	return false;
}

void dfs(int ii, int jj) {
	for (int k = 0; k < 4; k++) {
		int movei = ii + mv[k].x;
		int movej = jj + mv[k].y;

		if (!(movei >= 0 && movei < n && movej >= 0 && movej < m)) continue;
		if (visited[movei][movej] == 1) continue;
		
		visited[movei][movej] = 1;
		if (map[movei][movej] == 0) {
			dfs(movei, movej);
		}
		else {
			map[movei][movej] = 2;
		}
	}
}

void meltingcheese() {
	memset(visited, -1, sizeof(visited));

	visited[0][0] = 1;
	dfs(0, 0);
	ans = 0;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (map[i][j] == 1 || map[i][j] == 2) ans++;
			if (map[i][j] == 2) map[i][j] = 0;
		}
	}
}

int main(void) {
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> map[i][j];
		}
	}

	while (isEmpty()) {
		meltingcheese();
		answer++;
	}
	cout << answer << endl;
	cout << ans << endl;
}

'백준 알고리즘 > 구현' 카테고리의 다른 글

로봇 시뮬레이션 C++  (0) 2022.03.09
스위치 켜고 끄기  (0) 2022.03.08
마법사 상어와 토네이도 C++  (0) 2022.02.15
마법사 상어와 비바라기 C++  (0) 2022.02.05
마법사 상어와 블리자드 C++  (0) 2022.02.03