백준 6186 c++

magicdrill·2024년 4월 12일
0

백준 문제풀이

목록 보기
292/654

백준 6186 c++

어려운 문제를 결국 못풀고 쉬운 문제를 풀어버렸다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void input_map(vector <vector<char>> &grass, int *R, int *C)
{
	int i, j;

	cin >> *R >> *C;
	grass.resize(*R, vector<char>(*C, ' '));
	for (i = 0; i < *R; i++)
	{
		for (j = 0; j < *C; j++)
		{
			cin >> grass[i][j];
		}
	}

	return;
}

void BFS(vector <vector<char>>& grass, vector<vector<bool>> &visited, int start_y, int start_x, int R, int C)
{
	int current_x, current_y, next_x, next_y;
	vector<pair<int, int>>direction{ {1, 0},{0, 1},{-1, 0},{0, -1} };
	queue <pair<int, int>> q;
	int i, d_size = direction.size();
	
	visited[start_y][start_x] = true;
	q.push({start_x, start_y});
	while (!q.empty())
	{
		current_x = q.front().first;
		current_y = q.front().second;
		q.pop();
		for (i = 0; i < d_size; i++)
		{
			next_x = current_x + direction[i].first;
			next_y = current_y + direction[i].second;
			if ((next_x >= 0 && next_x < C) && (next_y >= 0 && next_y < R) 
				&& (visited[next_y][next_x] == false) 
				&& (grass[next_y][next_x] == '#'))
			{
				q.push({ next_x, next_y });
				visited[next_y][next_x] = true;
			}
		}
	}

	return;
}

void find_answer(vector <vector<char>>& grass, int R, int C)
{
	int i, j, count = 0;
	vector<vector<bool>> visited(R, vector<bool>(C, false));

	for (i = 0; i < R; i++)
	{
		for (j = 0; j < C; j++)
		{
			if (grass[i][j] == '#' && visited[i][j] == false)
			{
				count++;
				BFS(grass, visited, i, j, R, C);
			}
		}
	}
	cout << count << "\n";

	return;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	vector <vector<char>> grass;
	int R, C;

	input_map(grass, &R, &C);
	find_answer(grass, R, C);

	return 0;
}

0개의 댓글