반응형
문제 링크 : www.acmicpc.net/problem/2636
2636번: 치즈
첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진��
www.acmicpc.net
> 풀이
BFS 문제입니다.
0을 bfs방식으로 탐색하다가 1을 만날 경우 0으로 바꿔주는 방식으로 풀면 됩니다.
#include <bits/stdc++.h>
using namespace std;
queue<pair<int, int>> bfs;
int table[101][101];
int moveX[4] = {1, -1, 0, 0};
int moveY[4] = {0, 0, -1, 1};
bool visit[101][101];
int X, Y, cnt, res, last;
int main(void)
{
scanf("%d %d", &X, &Y);
for (int i = 0; i < X; i++)
for (int j = 0; j < Y; j++)
scanf("%d", &table[i][j]);
while (true) {
for (int i = 0; i < X; i++)
for (int j = 0; j < Y; j++)
if (table[i][j] == 1) last++;
if (last == 0) break;
else {
cnt++;
res = last;
}
memset(visit, false, sizeof(visit));
last = 0;
bfs.push({0, 0});
visit[0][0] = true;
while (!bfs.empty()) {
auto a = bfs.front();
int x = a.first, y = a.second;
bfs.pop();
for (int i = 0; i < 4; i++) {
int nx = x + moveX[i];
int ny = y + moveY[i];
if (nx >=0 && ny >= 0 && nx < X && ny < Y && !visit[nx][ny]) {
if (table[nx][ny] == 0)
bfs.push({nx, ny});
else if (table[nx][ny] == 1)
table[nx][ny] = 0;
visit[nx][ny] = true;
}
}
}
}
printf("%d\n%d", cnt, res);
return 0;
}
(개발 환경 : vscode)
반응형
'알고리즘 (백준) > BOJ 길라잡이 (1)' 카테고리의 다른 글
백준 1912 (연속합) / C++ (0) | 2020.11.05 |
---|---|
백준 2583 (영역 구하기) / C++ (0) | 2020.11.02 |
백준 7569 (토마토) / C++ (1) | 2020.10.07 |
백준 7576 (토마토) / C++ (0) | 2020.10.07 |
백준 2206 (벽 부수고 이동하기) / C++ (0) | 2020.08.25 |