본문 바로가기
이론/코딩테스트

[백준] 3184번 양 (BFS)

by 퇴근후개발 2022. 8. 26.
반응형

-문제

 

-코드

#include<queue>
#include<iostream>
using namespace std;

int dx[4] = {1,-1,0,0};
int dy[4] = { 0,0,1,-1 };

int main()
{
	int n, m, v_cnt=0, o_cnt=0, v=0,o=0;
	cin >> n >> m;

	char map[250][250];

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> map[i][j];
		}
	}

	queue<pair<int,int> > q;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (map[i][j] == '#') continue;
			if (map[i][j] != '#')
			{
				v_cnt = 0;
				o_cnt = 0;
				if (map[i][j] == 'v') v_cnt = 1;
				if (map[i][j] == 'o') o_cnt = 1;

				q.push({i,j});
				map[i][j] = '#';

				while (!q.empty())
				{
					pair<int, int> tmp = q.front();
					q.pop();
					for (int k = 0; k < 4; k++)
					{
						int xx = tmp.first + dx[k];
						int yy =  tmp.second + dy[k];
						if (xx >=n || yy >= m || xx<0 || yy < 0) continue;
						if (map[xx][yy] == '.')
						{
							q.push({xx,yy});
							map[xx][yy] = '#';
						}
						else if (map[xx][yy] == 'v')
						{
							q.push({ xx,yy });
							map[xx][yy] = '#';
							v_cnt++;
						}
						else if (map[xx][yy] == 'o')
						{
							q.push({ xx,yy });
							map[xx][yy] = '#';
							o_cnt++;
						}
					}
				}
				if (v_cnt < o_cnt) v_cnt = 0;
				else o_cnt = 0;
				v += v_cnt;
				o += o_cnt;

			}
		}
		
	}

	cout << o << ' ' << v;

	return 0;
}
반응형