관리 메뉴

기억을 위한 기록들

[백준 3187: 양치기 꿍] - C++ 본문

Coding Test - cpp/DFS

[백준 3187: 양치기 꿍] - C++

에드윈H 2021. 2. 5. 15:58

www.acmicpc.net/problem/3187

 

3187번: 양치기 꿍

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

www.acmicpc.net

#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>

using namespace std;
string map[251][251];
int chk[251][251];
int kNum;
int vNum;
int r, c;
int dir[5][2] = {
	{-1,0}
	,{0,1}
	,{0,0}
	,{1,0}
	,{0,-1}
};
void D(int _x, int _y)
{
	for (int i = 0; i < 5; i++)
	{
		int nextX = _x + dir[i][0];
		int nextY = _y + dir[i][1];

		if (nextX < 1 || nextY < 1 || r < nextX || c < nextY)
			continue;
		if (map[nextX][nextY] != "#" && chk[nextX][nextY] == 0)
		{			
			if (map[nextX][nextY] == "v")
			{
				vNum++;
			}
			else if (map[nextX][nextY] == "k")
			{
				kNum++;
			}
			chk[nextX][nextY] = 1;
			D(nextX, nextY);
		}
	}
}
int main()
{

	string input;
	cin >> r >> c;
	for (int i = 1; i <= r; i++)
	{
		cin >> input;
		for (int j = 1; j <= c; j++)
		{
			map[i][j] = input[j-1];
		}
	}

	int kResult = 0;
	int vResult = 0;

	for (int i = 1; i <= r; i++)
	{
		for (int j = 1; j <= c; j++)
		{
			if (map[i][j] == "v" || map[i][j] == "k")
			{
				kNum = 0;
				vNum = 0;
				D(i, j);
				if (vNum < kNum)
				{
					kResult += kNum;
				}
 				else if (vNum >= kNum)
				{					
					vResult += vNum;
				}
			}
		}
	}


	cout << kResult << " " << vResult << endl;
	return 0;
}

'Coding Test - cpp > DFS' 카테고리의 다른 글

[백준 2617: 구슬 찾기] - C++  (0) 2021.02.11
[백준 1926: 그림] - C++  (0) 2021.02.10
[백준 1743: 음식물 피하기] - C++  (0) 2021.02.04
[백준 13565: 침투] - C++  (0) 2021.02.01
[백준 2644: 촌수계산] - C++  (0) 2021.01.21