Coding_Test_C++

BaekJoon 11123번: 양 한마리... 양 두마리...(C++)

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

 

11123번: 양 한마리... 양 두마리...

얼마전에 나는 불면증에 시달렸지... 천장이 뚫어져라 뜬 눈으로 밤을 지새우곤 했었지.  그러던 어느 날 내 친구 광민이에게 나의 불면증에 대해 말했더니 이렇게 말하더군. "양이라도 세봐!"  

www.acmicpc.net

풀이법

1) BFS를 활용하여 나올 수 있는 묶음의 수를 문제이다.

2) 겹치지 않게 visit 배열을 활용하여 겹치지 않게 처리하면 풀 수 있다.

3) test case가 여러 개이므로 visited 배열을 초기화 하는 작업이 중요하다.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <set>
using namespace std;

int t;
char arr[101][101];
bool visited[101][101];
int a, b;
int cnt;
int vx[4] = { 1,0,0,-1 };
int vy[4] = { 0,1,-1,0 };
void bfs(int c, int d)
{
	queue<pair<int, int>> q;
	q.push({ c,d });
	visited[c][d] = true;
	while (!q.empty())
	{
		int bx = q.front().first;
		int by = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++)
		{
			int dx = vx[i] + bx;
			int dy = vy[i] + by;
			if (dx < 0 || dy < 0 || dx >= a || by >= b)
				continue;
			if (arr[dx][dy] == '#' && !visited[dx][dy])
			{
				visited[dx][dy] = true;
				q.push({ dx,dy });
			}
		}
	}

}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> t;
	for (int p = 0; p < t; p++)
	{
		
		cin >> a >> b;
		for (int i = 0; i < a; i++)
		{
			for (int j = 0; j < b; j++)
			{
				cin >> arr[i][j];
				visited[i][j] = false;
			}
		}
		cnt = 0;
		for (int i = 0; i < a; i++)
		{
			for (int j = 0; j < b; j++)
			{
				if (arr[i][j] == '#' && visited[i][j]==false)
				{
					bfs(i,j);
					cnt++;
				}
			}
		}
		cout << cnt<<'\n';
	}

}
	

'Coding_Test_C++' 카테고리의 다른 글

BaekJoon 16953번: A->B(C++)  (0) 2021.06.13
BaekJoon 10825번: 국영수(C++)  (0) 2021.06.12
BaekJoon 2210번: 숫자판 점프  (0) 2021.06.10
BaekJoon 10026번: 적록색약(C++)  (0) 2021.06.07
BaekJoon 10451번: 순열 사이클(C++)  (0) 2021.06.06