#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
bool check[51][51];
int grid[51][51];
int dx[8] = { -1,0,1,-1,1,-1,0,1 }; int dy[8] = { -1,-1,-1,0,0,1,1,1 };
int n, m;
void dfs(int x, int y) {
check[x][y] = true;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i]; int ny = y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && grid[nx][ny] == 1 && check[nx][ny] == false) {
dfs(nx, ny);
}
}
}
int main() {
//포인트: 정사각형이 아님
//대각선 이동도 가능
/// 섬의 갯수 세기.
while (1) {
cin >> m >> n;
if (n == 0 && m == 0) break;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &grid[i][j]);
check[i][j] = false;
}
}
int islands = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (check[i][j] == 0 && grid[i][j] == 1) {
dfs(i, j);
islands++;
}
}
}
cout << islands << endl;
}
return 0;
}
dx와 dy 단위좌표배열은 대각선을 포함해야하기 때문에 8개의 index로 구현한다.
dfs를 이용한 섬 수 세기.
'코딩 연습문제' 카테고리의 다른 글
백준 10451: 순열 사이클 / dfs (0) | 2019.07.18 |
---|---|
백준2667번: 단지번호 붙이기 / dfs & bfs (0) | 2019.07.18 |
백준 2178번: 미로 탐색 / bfs 구현 (0) | 2019.07.18 |