나의 브을로오그으

[c++] 1012번 : 유기농 배추 본문

알고리즘/BaekJoon

[c++] 1012번 : 유기농 배추

__jhp_+ 2022. 5. 18. 15:36

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

#include <iostream>
#include <stack>

#define MAX_POS			50
#define MIN_POS			0

using namespace std;

int countOfEarthworms(int cabages[][MAX_POS + 1], int N, int M, int K);
void eatCabage(int cabages[][MAX_POS + 1], bool check[][MAX_POS + 1], int x, int y, int* remain);

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int eqrthwarmCount = 0;
	int T, N, M, K;
	int X, Y;
	cin >> T;

	for (int i = 0; i < T; ++i)
	{
		int cabages[MAX_POS + 1][MAX_POS + 1] = { 0, };
		cin >> M >> N >> K;
		for (int j = 0; j < K; ++j)
		{
			cin >> X >> Y;
			cabages[Y][X] = 1;
		}
		eqrthwarmCount = countOfEarthworms(cabages, M, N, K);
		cout << eqrthwarmCount << '\n';
	}

	return 0;
}

int countOfEarthworms(int cabages[][MAX_POS + 1], int column, int row, int remainCabages)
{
	bool check[51][51] = { false, };
	int earthwarmCount = 0;

	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < column; ++j)
		{
			if (check[i][j] == false && cabages[i][j] == 1)
			{
				++earthwarmCount;
				eatCabage(cabages, check, j, i, &remainCabages);
			}
		}
		if (remainCabages <= 0) break;
	}
	return earthwarmCount;
}

void eatCabage(int cabages[][MAX_POS + 1], bool check[][MAX_POS + 1], int x, int y, int* remainCabages)
{
	stack<pair<int, int>> farm;
	int offset[4][2] = { {-1, 0}, {1, 0}, {0,-1}, {0, 1} };

	farm.push(pair<int, int>(x, y));
	*remainCabages -= 1;
	check[y][x] = true;
	while (!farm.empty())
	{
		pair<int, int> cur = farm.top();
		farm.pop();
		for (int i = 0; i < sizeof(offset) / sizeof(offset[0]); ++i)
		{
			int nextX = cur.first + offset[i][0];
			int nextY = cur.second + offset[i][1];

			if (nextX < MIN_POS || nextY < MIN_POS
				|| nextX > MAX_POS || nextY > MAX_POS
				|| cabages[nextY][nextX] == 0
				|| check[nextY][nextX] == true)
			{
				continue;
			}
			else
			{
				farm.push(cur);
				farm.push(pair<int, int>(nextX, nextY));
				*remainCabages -= 1;
				check[nextY][nextX] = true;
				break;
			}
		}
	}
	return;
}

'알고리즘 > BaekJoon' 카테고리의 다른 글

[c++] 1107번 : 리모컨  (0) 2022.05.30
[c++] 1074번 : Z  (0) 2022.05.20
[c++] 1003번 : 피보나치 함수  (0) 2022.05.18
[c++] 18111번 : 마인크래프트  (0) 2022.05.17
[c++] 15829번 : Hashing  (0) 2022.05.16