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 |