https://www.acmicpc.net/problem/2638
#문제 해결 방법
친절하게도 가장자리에는 치즈가 놓이지 않는다고 했으니
외곽부터 외부공기를 탐색하고 난 후 남은 공기는
내부 공기로 취급하면 된다.
나는 외부 공기를 그냥 bool 배열을 사용해서 따로 표시했다.
기존의 맵이랑 같이 표시하는 방법이 더 효율이 좋을 듯 한데
그냥 더 직관적인 방법을 사용했다.
1.외부공기를 확인한 후에
2. 외부공기 2개가 맞닿은 치즈 확인 -> 지우기
findOx(0, 0);
cheeseCheck();
를 반복하고
치즈가 0이 될때 까지 반복된 순서를 출력 하면 된다.
#전체 코드
#include <iostream>
#include <vector>
using namespace std;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int cheeseCount;
int n, m;
vector<vector<int>> world;
vector<vector<bool>> check;
bool boundary(int x, int y) {
if (0 <= x && x < n && 0 <= y && y < m) return true;
return false;
}
void findOx(int x, int y) {
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (boundary(nx, ny)) {
if (world[nx][ny] == 0 && check[nx][ny] == false) {
check[nx][ny] = true;
findOx(nx, ny);
}
}
}
}
void cheeseCheck() {
for (int a = 0; a < n; a++) {
for (int b = 0; b < m; b++) {
if (world[a][b] == 1) {
int oxCount = 0;
for (int i = 0; i < 4; i++) {
int nx = a + dx[i];
int ny = b + dy[i];
if (boundary(nx, ny)) {
if (check[nx][ny] == true) {
oxCount++;
}
}
}
if (oxCount >= 2) {
world[a][b] = 0;
cheeseCount--;
}
}
}
}
}
int main() {
//1. 일단 공기를 돌면서 치즈에 갖혀있는지 아닌지 판별한다
// ->가장자리 공기를 탐색하고 외부 탐색이 안 되었다면 내부 공기
//2.치즈를 녹이고 시간을 보낸후 치즈가 0개라면 시간 출력
cin >> n >> m;
world.resize(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> world[i][j];
if (world[i][j] == 1) cheeseCount++;
}
}
int phase = 0;
while (cheeseCount > 0) {
check.assign(n, vector<bool>(m, false));
//외부 공기 확인
check[0][0] = true;
findOx(0, 0);
//접촉 치즈 확인
cheeseCheck();
phase++;
}
cout << phase << '\n';
return 0;
}
'[백준] > C++' 카테고리의 다른 글
백준 31962번 밤양갱 [C++] (3) | 2024.07.23 |
---|---|
백준 8972번 미친 아두이노 [C++] (0) | 2024.07.18 |
백준 10703번 유성 [C++] (0) | 2024.07.11 |
백준 1456번 거의 소수 [C++] (0) | 2024.07.08 |
백준 30677번 반짝반짝 빛나는 별가루 [C++] (0) | 2024.07.06 |