백준[4963] - 섬의 개수

문제

백준 4963 문제 보기

접근 방법

동서남북과 대각선 방향을 맵의 유효 범위안에서 완전 탐색하면 답을 출력할 수 있다.

코드

#include <iostream>
#include <cstring>
using namespace std;
int h, w;
int map[50][50];
int visited[50][50];
// 동 북 남 서
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, -1, 0, 1};
// 대각선 방향
int dx2[4] = {1, 1, -1, -1};
int dy2[4] = {1, -1, -1, 1};
int dfs(int i, int j) {
visited[i][j] = 1;
for(int k = 0; k < 4; k ++) {
// 지도 범위 체크
if(j + dx[k] >= 0 && j + dx[k] < w && i + dy[k] >= 0 && i + dy[k] < h) {
// 땅이면서 방문하지 않았는지 체크
if(map[i + dy[k]][j + dx[k]] && !visited[i + dy[k]][j + dx[k]])
dfs(i + dy[k], j + dx[k]);
}
}
for(int k = 0; k < 4; k ++) {
if(j + dx2[k] >= 0 && j + dx2[k] < w && i + dy2[k] >= 0 && i + dy2[k] < h) {
if(map[i + dy2[k]][j + dx2[k]] && !visited[i + dy2[k]][j + dx2[k]])
dfs(i + dy2[k], j + dx2[k]);
}
}
return 0;
}
int main() {
while(1) {
cin >> w >> h;
if(w == 0 && h == 0)
break;
memset(map, 0, sizeof(map));
memset(visited, 0, sizeof(visited));
for(int i = 0; i < h; i ++) {
for(int j = 0; j < w; j ++) {
cin >> map[i][j];
}
}
int cnt = 0;
for(int i = 0; i < h; i ++) {
for(int j = 0; j < w; j ++) {
if(map[i][j] && !visited[i][j]) {
cnt ++;
dfs(i, j);
}
}
}
cout << cnt << '\n';
}
return 0;
}
Share