반응형
그림을 보고 문제에 접근하면 조금 더 발상이 쉽습니다. 그릇의 가장자리에는 치즈가 놓이지 않으며 치즈는 바깥에서부터 녹아 없어집니다.
while문을 통해 판 위에 치즈가 없어질 때 까지(배열의 모든 원소가 0이 될 때 까지) 다음을 반복합니다. 가장 가장자리에서 BFS를 시작하고 치즈가 놓여있지 않은 좌표만 방문합니다. 다음 위치가 치즈인 경우 해당 원소의 값을 따로 변경해줍니다.(2로 변경) 치즈가 없어졌는지 확인하는 과정에서 2로 체크해준 치즈의 개수를 체크하고 원소가 2인 경우 0으로 변경해줍니다. (아래 코드에서는 cnt라는 변수를 따로 두어서 원소를 변경해 줄 때 마다 +1을 해 줬지만 어떻게 하든 동일한 결과가 나옵니다.) 판 위에 남은 치즈가 있는지를 확인하고 치즈가 남지 않은 경우 치즈의 개수와 날짜를 출력해줍니다.
#include <iostream>
#include <queue>
#include <string.h>
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int N, M;
int arr[102][102];
int visited[102][102];
int day, cnt;
queue<pii> q;
bool cheesechk(){
bool chk=true;
for(int i=0;i<=N;i++){
for(int j=0;j<=M;j++){
if(arr[i][j]==2) arr[i][j]=0;
if(arr[i][j]==1) chk=false;
}
}
return chk;
}
int main(){
cin>>N>>M;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
cin>>arr[i][j];
}
}
while(!cheesechk()){
q.push({0,0});
day++;
cnt=0;
memset(visited, 0, sizeof(visited));
while(!q.empty()){
pii cur = q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=cur.x+dx[i];
int ny=cur.y+dy[i];
if(nx<0||ny<0||nx>N+1||ny>M+1) continue;
if(visited[nx][ny]) continue;
if(arr[nx][ny]==1){
cnt++; arr[nx][ny]=2; continue;
}
if(arr[nx][ny]==2) continue;
q.push({nx,ny});
visited[nx][ny]=1;
}
}
}
cout<<day<< '\n'<<cnt;
}
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 18877 ) Social Distancing (C++) (0) | 2022.06.10 |
---|---|
BOJ 2428 ) 표절 (C++) (0) | 2022.06.09 |
BOJ 8983 ) 사냥꾼 (C++) (0) | 2022.05.01 |
BOJ 11652) 카드 (C++) (0) | 2022.03.12 |
BOJ 12100) 2048(Easy) (C++) (0) | 2021.10.05 |