https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=411
Softeer
제한시간 : C/C++(1초), Java/Python(2초) | 메모리 제한 : 128MB 입력형식 첫째 줄에는 격자 화면의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 격자 화면 위에
softeer.ai
[난이도] level3
[유형] DFS
[풀이]
가장자리에는 얼음이 없다는 것이 보장되기 때문에
0,0에서부터 0(얼음) 인 점을 탐색하면서 4방향을 검사해서 얼음이 있으면 얼음의 좌표에 외부 공기에 접한 횟수를 카운팅 해줍니다.
그 뒤 2이상 카운팅된 얼음을 지워주는 것을 모든 얼음이 사라질때까지 반복하면 됩니다.
#include <cstdio>
#include <cstring>
int N,M,dy[4]={-1,1,0,0},dx[4]={0,0,1,-1};
int map[100][100],cnt[100][100],visit[100][100],ans;
void dfs(int y,int x){
visit[y][x]=1;
for(int i=0;i<4;i++){
int ny=y+dy[i], nx=x+dx[i];
if(ny<0||nx<0||ny>=N||nx>=M||visit[ny][nx]) continue;
if(map[ny][nx]){
cnt[ny][nx]++;
}else{
dfs(ny,nx);
}
}
}
bool exist(){
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) if(map[i][j]) return true;
return false;
}
int main(){
bool ok=0;
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) {
scanf("%d",&map[i][j]);
if(map[i][j]) ok=1;
}
while(ok){
ans++;
dfs(0,0);
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) if(cnt[i][j]>=2) map[i][j]=0;
ok=exist();
memset(visit,0,sizeof(visit));
memset(cnt,0,sizeof(cnt));
}
printf("%d",ans);
}
https://github.com/has2/Problem-Solving/blob/master/softeer/level3/동계_테스트_시점_예측.cpp
'Problem-Solving > Softeer' 카테고리의 다른 글
[Softeer/소프티어][level5] 복잡한 조립라인2 (C++) (0) | 2021.10.05 |
---|---|
[Softeer/소프티어][level4] 복잡한 조립라인1 (C++) (0) | 2021.10.04 |
[Softeer/소프티어][level3] 수퍼바이러스 (C++) (0) | 2021.10.04 |
[Softeer/소프티어][level4] 징검다리2 (C++) (0) | 2021.10.04 |
[Softeer/소프티어][level3] 징검다리 (C++) (0) | 2021.10.04 |