2638번: 치즈
첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표
www.acmicpc.net
bfs를 이용해 치즈가 모두 녹는 시간을 출력하는 문제였습니다.
풀이방법
1. 가장자리에 치즈를 놓는 경우는 없으므로 (0, 0)은 무조건 외부공기에 해당합니다. 이를 시작점으로 bfs를 진행합니다.
2-1. bfs함수 안에서 인접한 상하좌우 칸이 공기(0)라면, check해준 후 air queue에 넣어줍니다.
2-2. 인접한 칸이 치즈(1)라면, cheese queue에 무조건 넣어줍니다. 이를 통해 2번 이상 같은 좌표가 들어갈 수 있는데 이는 치즈를 녹일 때 확인하며 지우기 위해 중복으로 넣어주는 것 입니다. 이 후에 설명합니다
3-1. meltCheese함수를 호출해 치즈를 녹입니다. 외부공기와 접촉한 cheese의 좌표들을 찾아 cheese를 체크해주는데 단순히 1로 만드는 것이 아니라 1을 더해줍니다.
3-2. 이를 통해 해당 값이 2라면 해당 좌표의 map[x][y]를 녹여(0으로 만들어)줍니다. 해당 값이 2라는 말은 인접한 치즈가 2개였었던 말이고 이는 즉 외부공기와 접촉하고 있는 치즈 면 또한 2개라는 의미이므로 녹일 수 있습니다. 그 칸은 공기(0)칸으로 만들어 줍니다.
4. 치즈가 완전히 녹을 때까지 BFS, meltCheese함수를 반복한다.
Code
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
int n,m, ans;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int map[101][101];
int checkAir[101][101];
int checkCheese[101][101];
queue <pair<int,int>> cheese,air;
void meltCheese() {
while (!cheese.empty()) {
int x = cheese.front().first;
int y = cheese.front().second;
cheese.pop();
checkCheese[x][y]++;
if (checkCheese[x][y] == 2) {
map[x][y] = 0;
}
}
}
bool isAllMelt(){
for(int i =0; i < n; i++){
for(int j = 0; j < m; j++){
if(map[i][j]) return 0;
}
}
return 1;
}
void bfs() {
air.push({0,0});
checkAir[0][0] = 1;
while (!air.empty()) {
int x = air.front().first;
int y = air.front().second;
air.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0 > nx || nx >= n || 0 > ny || ny >= m) continue;
if (checkAir[nx][ny])continue;
//치즈라면
if (map[nx][ny]) {
cheese.push({ nx,ny });
continue;
}
//외부공기라면
checkAir[nx][ny] = true;
air.push({ nx,ny });
}
}
}
int main(){
fastio;
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> map[i][j];
}
}
while(!isAllMelt()){
ans++;
memset(checkCheese,0,sizeof(checkCheese));
memset(checkAir,0,sizeof(checkAir));
bfs();
meltCheese();
}
cout << ans <<'\n';
}
'Algorithm > BFS' 카테고리의 다른 글
(C++) - 프로그래머스(고득점 kit - (DFS/BFS)) : 네트워크 답 (0) | 2021.02.11 |
---|---|
(C++) - 프로그래머스(2017 카카오 코드 예선) : 카카오프렌즈 컬러링북 (0) | 2020.12.27 |
(C++) - 백준(BOJ) 2589번 : 보물섬 답 (0) | 2020.09.19 |
(C++) - 백준(BOJ) 11866번 : 다리만들기 (1) | 2020.08.01 |
(C++) - 백준(BOJ) 1260번 : DFS와 BFS 답 (0) | 2020.07.13 |