4963번: 섬의 개수
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도�
www.acmicpc.net
전과 매우 유사한 문제. 탐색 범위를 대각선도 넣어주고, 각 케이스마다 모두 배열을 초기화 하는 것을 잊지말자(런타임 에러 주의!)
#include <cstdio>
int array[52][52];
bool visit[52][52];
void dfs(int x, int y){
visit[x][y] = true;
if(array[x+1][y] == 1 && visit[x+1][y]==false)
dfs(x+1, y);
if(array[x][y+1] == 1 && visit[x][y+1]==false)
dfs(x, y+1);
if(array[x-1][y] == 1 && visit[x-1][y]==false)
dfs(x-1, y);
if(array[x][y-1] == 1 && visit[x][y-1]==false)
dfs(x, y-1);
if(array[x-1][y-1] == 1 && visit[x-1][y-1]==false)
dfs(x-1, y-1);
if(array[x+1][y-1] == 1 && visit[x+1][y-1]==false)
dfs(x+1, y-1);
if(array[x-1][y+1] == 1 && visit[x-1][y+1]==false)
dfs(x-1, y+1);
if(array[x+1][y+1] == 1 && visit[x+1][y+1]==false)
dfs(x+1, y+1);
}
int main(void){
int k, l, ans;
while(1){
scanf("%d %d", &k, &l);//l이 h
if(l==0 && k==0)
break;
for(int q=0; q<52; q++){
for(int w=0; w<52; w++){
array[q][w]=0;
visit[q][w]=false;
}
}
for(int q=0; q<l; q++){
for(int w=0; w<k; w++){
scanf(" %d",&array[q][w]);
}
}
ans = 0;
for(int q=0; q<l; q++){
for(int w=0; w<k; w++){
if(array[q][w]==1 && visit[q][w]==false){
dfs(q, w);
ans++;
}
}
}
printf("%d\n", ans);
}
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 3184번] 양 (Silver 2) (0) | 2020.09.28 |
---|---|
[C/C++ 백준 2644번] 촌수계산 (Silver 2) (0) | 2020.09.26 |
[C/C++ 백준 1012번] 유기농 배추 (Silver 2) (0) | 2020.09.24 |
[C/C++ 백준 11724번] 연결 요소의 개수 (Silver 2) (0) | 2020.09.23 |
[C/C++ 백준 2606번] 바이러스 (Silver 3) (0) | 2020.09.22 |