관리 메뉴

기억을 위한 기록들

[백준 4936: 섬의 개수] - C++ 본문

Coding Test - cpp/BFS

[백준 4936: 섬의 개수] - C++

에드윈H 2021. 1. 18. 11:15

www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;

#define MAXSIZE 50

int map[MAXSIZE][MAXSIZE];
bool visited[MAXSIZE][MAXSIZE];

int dir[8][2] = {
	{-1,-1},
	{-1,0},
	{-1,1},
	{0,-1},
	{0,1},
	{1,-1},
	{1,0},
	{1,1}
};

int main() {

	int w, h;

	while (1)
	{
		cin >> w >> h;

		if (w == 0 && h == 0 )
			break;

		memset(map, 0, sizeof(map));

		for (int i = 0; i < h; i++)
		{
			for (int j = 0; j < w; j++)
			{
				cin >> map[i][j];

			}

		}

		queue<pair<int, int>> Q;

		int result = 0;

		for (int i = 0; i < h; i++)
		{
			for (int j = 0; j < w; j++)
			{
				if (map[i][j] == 0 || MAXSIZE <= i || MAXSIZE <= j)
					continue;

				Q.push({ i,j });
				map[i][j] = 0;

				while (!Q.empty())
				{
					int curH = Q.front().first;
					int curW = Q.front().second;
					Q.pop();

					for (int index = 0; index < 8; index++)
					{
						int nextH = dir[index][0] + curH;
						int nextW = dir[index][1] + curW;

						if (nextH < 0 || nextW < 0 || MAXSIZE <= nextW || MAXSIZE <= nextH)
						{
							continue;
						}

						if (map[nextH][nextW] == 1)
						{						
							map[nextH][nextW] = 0;
							Q.push({ nextH,nextW });
						}
					}
				}

				result++;
			}
		}

		cout << result << endl;
	}
	return 0;
}