solve() : 전체 그림을 탐색하면서 bfs를 수행하는 횟수를 카운팅한다.
bfs() : 파라미터로 option을 넣어서
0일 경우에는 R / G / B 를 구분하는 탐색을 진행하고
1일 경우에는 R,G / B 를 구분하는 탐색을 진행하도록 했다.
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n;
int fdx[4] = {0, 0, 1, -1};
int fdy[4] = {1,-1,0,0};
int v[100][100]={0,};
string a[100];
bool checkPosition(int x, int y){
return x >= 0 && y >= 0 && x < n && y < n ? true : false;
}
void bfs(int sx, int sy, int option){
queue<pair<char, pair<int,int>>> q;
q.push({a[sx][sy], {sx,sy}});
v[sx][sy] = 1;
while (!q.empty())
{
int x = q.front().second.first;
int y = q.front().second.second;
char w = q.front().first;
q.pop();
for (int i = 0; i < 4; i++){
int dx = x + fdx[i];
int dy = y + fdy[i];
if(checkPosition(dx,dy) && v[dx][dy] == 0){
bool canPush = false;
char dw = a[dx][dy];
if(w == dw){
canPush = true;
}
if(option == 1){
if((w == 'R' || w == 'G' ) && (dw == 'R' || dw == 'G' )){
canPush = true;
}
}
if(canPush){
q.push({dw, {dx, dy}});
v[dx][dy] = 1;
}
}
}
}
}
void solve(){
int count = 0;
int countRG = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++){
if(v[i][j] == 0){
count++;
bfs(i,j,0);
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
v[i][j] = 0;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++){
if(v[i][j] == 0){
countRG++;
bfs(i,j,1);
}
}
}
cout << count << "\n";
cout << countRG << "\n";
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++){
cin >> a[i];
}
solve();
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준] 5525번 IOIOI c++ (0) | 2022.12.10 |
---|---|
[백준] 5430번 AC c++ (0) | 2022.12.10 |
[백준] 1992번 쿼드트리 c++ (0) | 2022.11.29 |
[백준] 4485번 녹색 옷 입은 애가 젤다지? c++ (0) | 2022.11.28 |
[백준] 1780번 종이의 개수 c++ (0) | 2022.11.27 |