- 큐를 이용하여 BFS 탐색하는 기본 문제
- 두번째 풀 때는 단지 내부에 있는 집의 개수를 세기 위해 vector를 이용하려고 했는데 잘 안됐다.
다음 번에는 벡터로 풀어봐야겠다.
- DFS 로도 풀어봐야겠다!
https://www.acmicpc.net/problem/2667
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int n, cnt;
int map[26][26];
int visited[26][26];
int ans[26*26];
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
void bfs(int x, int y, int cnt){
queue<pair<int, int> > q;
q.push(make_pair(x,y));
visited[x][y]=cnt;
while(!q.empty()){
x = q.front().first;
y = q.front().second;
q.pop();
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0 && ny>=0 && nx<n && ny<n){
if(visited[nx][ny]==0 && map[nx][ny]==1){
q.push(make_pair(nx,ny));
visited[nx][ny]=cnt;
}
}
}
} //while end
}
int main(){
scanf("%d", &n);
for(int i=0; i<n; i++){
ans[i]=0;
for(int j=0; j<n; j++){
scanf("%1d", &map[i][j]);
visited[i][j]=0;
}
} // input end
cnt=0;
for(int i=0; i<n; i++){ // 전체 지도 탐색하기
for(int j=0; j<n; j++){
if(visited[i][j]==0 && map[i][j]==1){
bfs(i,j,++cnt);
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
ans[visited[i][j]] += 1;
// visited 원소 (1,2,3)의 갯수 세기.
}
}
//output field
printf("%d\n", cnt);
sort(ans+1, ans+cnt+1);
for(int i=1; i<=cnt; i++){
printf("%d\n", ans[i]);
}
}
'BOJ' 카테고리의 다른 글
BOJ 1463 1로 만들기 (0) | 2019.07.18 |
---|---|
BOJ 4963 섬의 개수 (0) | 2019.04.13 |
BOJ 2468 안전 영역 DFS (0) | 2019.04.07 |
BOJ 10026 적록색약 (0) | 2019.04.07 |
BOJ 2583 영역 구하기 DFS (0) | 2019.04.06 |