티스토리 뷰
728x90
문제 링크
풀이
치즈 외부의 공기와 접촉하면 치즈가 녹아 없어지지만, 내부 공기와 접촉된 치즈에 대해선 처리하지 않아야합니다.
bfs를 돌리는데, 치즈를 주체로 돌리지 않고 (0, 0)의 공기를 시작점으로 하여 돌려줍시다.
정답 코드
#include <bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
using pii = pair<int, int>;
int n, m;
int p[111][111];
bool chk[111][111];
bool isValid(int x, int y) {
return 0 <= x && x < n && 0 <= y && y < m;
}
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int bfs() {
queue<pii> q, del;
int cnt = 0;
memset(chk, 0, sizeof(chk));
chk[0][0] = true;
q.emplace(0, 0);
while (!q.empty()) {
auto[x, y] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k], ny = y + dy[k];
if (!isValid(nx, ny) || chk[nx][ny]) continue;
if (p[nx][ny]) {
del.emplace(nx, ny);
cnt++;
} else {
q.emplace(nx, ny);
}
chk[nx][ny] = true;
}
}
while (!del.empty()) {
auto[x, y] = del.front();
del.pop();
p[x][y] = 0;
}
return cnt;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
pii ans;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> p[i][j];
ans.sd += p[i][j];
}
}
while (ans.sd > 0) {
int c = bfs();
ans.ft += 1;
if (ans.sd - c == 0) break;
ans.sd -= c;
}
cout << ans.ft << '\n' << ans.sd;
}
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 1197 최소 스패닝 트리 (0) | 2021.03.07 |
---|---|
[BOJ] 백준 1007 벡터 매칭 (0) | 2021.03.07 |
[BOJ] 백준 1244 스위치 켜고 끄기 (KOI 2000 초등부) (0) | 2021.02.18 |
[BOJ] 백준 2635 수 이어가기 (KOI 2000 초등부) (0) | 2021.02.18 |
[BOJ] 백준 2643 색종이 올려 놓기 (KOI 1999 초등부) (1) | 2021.02.18 |
댓글