티스토리 뷰
반응형
[Point] DFS를 이용해 그래프의 연결요소(Connected Component)의 갯수를 찾아내라
그래프의 연결요소란 이동가능한 "뭉치"라고 생각하면 된다. 이 문제에서 요구하는 섬의 정의와 그 갯수는 그래프의 연결요소 개수와 일맥상통한다.
우선 w=0,h=0이 들어오지 않는 이상 무한루프로 케이스를 입력받고 결과값을 출력하면 된다.
매 과정이 반복될때마다 방문여부를 알려주는 visit[][]과 섬의 갯수를 알려주는 cnt 변수를 도로 초기화하는 것을 잊으면 안된다.
코드는 간단하다.
방향배열 dx,dy를 이용해 탐색가능한 8개의 주변 정사각형을 검사한다.
①이동가능하면서(map[][]=1) ②맵을 벗어나지 않는 유효한 범위(nx와 ny의 범위 체크), ③마지막으로 한번도 방문한 적이 없는 곳(visit=0)이라면,
함수를 재귀호출하여 visit 값을 1로 변경해주면 된다. 더이상 주변에 탐색가능한 섬이 없을때 DFS함수는 종료되고 cnt값이 1 증가하게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <stdio.h> int visit[50][50]={0}; int map[50][50]; int dx[8]={-1,-1,0,1,1,1,0,-1}; int dy[8]={0,1,1,1,0,-1,-1,-1}; int w,h; void DFS(int x,int y){ int i,nx,ny; visit[x][y]=1; for(i=0;i<8;i++){ nx=x+dx[i]; ny=y+dy[i]; if(nx>=h || nx<0 || ny>=w || ny<0){ continue; } if(visit[nx][ny]==0 && map[nx][ny]==1){ DFS(nx,ny); } } } int main(){ int cnt; int i,j; while(1){ scanf("%d%d",&w,&h); if(w==0 && h==0){ return 0; } for(i=0;i<50;i++){ for(j=0;j<50;j++){ visit[i][j]=0; } } cnt=0; for(i=0;i<h;i++){ for(j=0;j<w;j++){ scanf("%d",&map[i][j]); } } for(i=0;i<h;i++){ for(j=0;j<w;j++){ if(visit[i][j]==0 && map[i][j]==1){ DFS(i,j); cnt++; } } } printf("%d\n",cnt); } return 0; } | cs |
반응형
'개인 서재..* > 문제풀이' 카테고리의 다른 글
백준 2346번 문제. 풍선 터뜨리기 (0) | 2017.05.22 |
---|---|
백준 1005번 문제. ACM Craft (0) | 2017.05.19 |
백준 2178번 문제. 미로 탐색 (0) | 2017.05.15 |
백준 1260번 문제. DFS와 BFS (0) | 2017.05.10 |
백준 2439번 문제. 별찍기-2 (0) | 2017.05.02 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 급수에러
- 마민재쉐프
- 4E표시
- 겨울철 동파
- 아난티앳강남
- 자취요리
- 스텐팬 세척
- 스파투어 파트4
- 타르코프 스파 투어
- 구글애드센스 광고차단
- 자취 집들이
- 스텐팬 갈색
- 스파관광 파트4
- 싱크대 단수
- 건강검진 겨드랑이
- 친구들호캉스
- 스시이마
- 사마귀광고 제거
- 초간단 샤브샤브
- 구글애드센스 혐오광고
- 겨드랑이 지방종
- 물이 안나와요
- 겨드랑이 초음파
- 스텐팬 갈변
- 혐오광고 제거
- 겨드랑이 혹
- 스파 파트 4
- 타르코프 스파 관광
- 드럼세탁기 고장
- 스텐팬 탄 자국
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함