코딩 연습문제

백준 4963번: 섬의 개수 / dfs와 단위좌표를 이용한 풀이

집빈지노 2019. 7. 18. 17:24
#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를 이용한 섬 수 세기.