본문 바로가기

알고리즘 문제

[C/C++ 백준 4963번] 섬의 개수 (Silver 2)

www.acmicpc.net/problem/4963

 

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);
	}
}