[BOJ] 백준 2638 치즈
이 문제 또한 마찬가지(2636 치즈) 마찬가지 유형이다.
다른점이라고는, 2636번에선 치즈가 외부공기와 닿기만해도 썩어버렸는데, 이번엔 두번 닿아야 썩는 것이다. 그래서 hp개념을 도입했다. hp가 2가 되면 썩는 것이다. 알고리즘은 동일하나, if-else 부분을 추가해서 hp를 늘렸다.
소스코드 :
#include#include #include using namespace std; int a, b; vector< vector > v(101, vector (101, 0)); vector< vector > visited(101, vector (101, 0)); vector< vector > hp(101, vector (101, 0)); // 4방향 탐색 방향 지정 struct dir{ int x, y; }; dir Dir[4] = { {-1,0}, {1,0}, {0,-1}, {0,1} }; // 외부공기를 탐색할 DFS void dfs(int x, int y) { for (int i = 0; i < 4; i++) { int rx = x + Dir[i].x; int ry = y + Dir[i].y; if (rx >= 0 && rx < a && ry < b && ry >= 0) { if (v[rx][ry] != 1 && visited[rx][ry] == 0) { v[rx][ry] = -1; visited[rx][ry] = 1; dfs(rx,ry); } } } } int main() { cin >> a >> b; cin.ignore(); int cnt = 0; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { cin >> v[i][j]; if (v[i][j] == 1) { cnt++; // 1의 개수를 센다. } } cin.ignore(); } int timer = 0; // 초기 외부공기 탐색 dfs(0, 0); while (cnt > 0) { // 시간을 탐지할 timer timer++; vector > pairvec; for (int i = 1; i < a-1 ; i++) { for (int j = 1; j < b-1 ; j++) { if (v[i][j] == 1) { if (v[i - 1][j] == -1) hp[i][j]++; if (v[i + 1][j] == -1) hp[i][j]++; if (v[i][j - 1] == -1) hp[i][j]++; if (v[i][j + 1] == -1) hp[i][j]++; // 없애야 할 치즈를 벡터에 넣음. if(hp[i][j] >=2) pairvec.push_back({ i,j }); } } } // 치즈 썩은거 없앰 (그리고 -1로 초기화(외부공기니까)) for (int w = 0; w < pairvec.size(); w++) { v[pairvec[w].first][pairvec[w].second] = -1; cnt--; } // 다시 외부공기 탐색. for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { hp[i][j] = 0; if (visited[i][j] != 1 && v[i][j] == -1) { dfs(i, j); } } } } cout << timer << endl ; }
댓글
댓글 쓰기