# 백준 : 섬의 개수 (4963)
문제
https://www.acmicpc.net/problem/4963소스
(Github: https://github.com/wonjnlee/wallydev/blob/master/bj_4963_numberofislands)#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdlib>
using namespace std;
int map[51][51];
int visit[51][51];
int W, H;
int cnt;
void DFS(int h, int w) {
visit[h][w] = 1;
if ((h > 0) && map[h - 1][w] && !visit[h - 1][w]) {
DFS(h - 1, w);
}
if ((h < H - 1) && map[h + 1][w] && !visit[h + 1][w]) {
DFS(h + 1, w);
}
if ((w > 0) && map[h][w - 1] && !visit[h][w - 1]) {
DFS(h, w - 1);
}
if ((w < W - 1) && map[h][w + 1] && !visit[h][w + 1]) {
DFS(h, w + 1);
}
if (h > 0) {
if ((w > 0) && map[h - 1][w - 1] && !visit[h - 1][w - 1]) {
DFS(h - 1, w - 1);
}
if ((w < W - 1) && map[h - 1][w + 1] && !visit[h - 1][w + 1]){
DFS(h - 1, w + 1);
}
}
if (h < H - 1) {
if ((w > 0) && map[h + 1][w - 1] && !visit[h + 1][w - 1]) {
DFS(h + 1, w - 1);
}
if ((w < W - 1) && map[h + 1][w + 1] && !visit[h + 1][w + 1]) {
DFS(h + 1, w + 1);
}
}
}
int main(void)
{
W = 1;
H = 1;
while (1) {
cin >> W >> H;
if ((W == 0) && (H == 0)) break;
cnt = 0;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (map[i][j] && !visit[i][j]) {
DFS(i, j);
cnt+=1;
}
}
}
cout << cnt << endl;
cnt = 0;
memset(map, 0, sizeof(map));
memset(visit, 0, sizeof(visit));
}
return 0;
}
풀이
DP로 풀까 고민하다가 손에 익은 백트래킹을 이용했다.문제의 유형이 비슷해서 이전 포스팅과 같이 전체 비교 후 cnt를 증가하는 방법을 사용했다.
댓글
댓글 쓰기