https://www.acmicpc.net/problem/2667
유기농 배추 문제와 유사한 문제이다.
집이 연결되어 있는 곳이 전체 몇개 인지를 구하는 문제이다.
다만, 연결되어 있는 집 각각이 총 몇개의 집이 있는지를 정렬해서 출력해주면 되는 문제이다.
입력을 받을 때 문자열 형태로 들어와서
cin으로 맵을 표현한 int형 2차원 배열을 계속해서 입력받다보니 올바르지 못한 값이 입력된다.
그렇기 때문에 char형 문자로 입력받고 이 값을 int형 2차원 배열에 넣어줘서 1이 있는 곳을 표시할 수 있도록 하였다.
그리고 dfs 함수를 구현할 때
cnt 라는 값을 통해서 몇개의 단지 내 집이 있는지를 return해주는 방식으로 구현하였다.
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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int dy[4]={1,-1,0,0}; int dx[4]={0,0,1,-1}; int N; int arr[25][25]={0}; int visited[25][25]={0}; int dfs(int y,int x){ int cnt=1; for(int i=0;i<4;i++){ int ny=y+dy[i]; int nx=x+dx[i]; if(ny<0 || ny>=N || nx<0 || nx>=N) continue; if(arr[ny][nx]==0 || visited[ny][nx]) continue; visited[ny][nx]++; cnt+=dfs(ny,nx); } return cnt; } int main(){ char c; cin>>N; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ cin>>c; if(c=='1') arr[i][j]=1; } } int ans=0; //총 단지 수 vector<int> vec; //단지내 집의 수 for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(arr[i][j] && !visited[i][j]){ ans++; visited[i][j]++; vec.push_back(dfs(i,j)); } } } sort(vec.begin(),vec.end()); cout<<ans<<endl; for(int i=0;i<vec.size();i++) cout<<vec[i]<<endl; return 0; } | cs |
'알고리즘(BOJ) > DFS' 카테고리의 다른 글
백준 1987번 - 알파벳 (0) | 2018.01.28 |
---|---|
백준 2468번 - 안전 영역 (3) | 2018.01.28 |
백준 2583번 - 영역 구하기 (2) | 2018.01.28 |
백준 1012번 - 유기농 배추 (0) | 2018.01.28 |
백준 11403번 - 경로찾기 (0) | 2018.01.28 |