기존 BFS에서 1로 탐색 지점을 표시했다면 이번에는 RGB중 1개 이므로
영역이 같은지는 아래와 같이 판단한다
if (v[cur.first][cur.second] == v[yy][xx]) //if(현재영역 값 == 너비탐색하는영역 값)
이 문제에서는 적록색약 사람의 관점도 요구하기 때문에
for로 G를 R로 바꾸어 BFS를 재활용한다.
#include <bits/stdc++.h>
using namespace std;
int dx[4] = {1, 0 , -1, 0};
int dy[4] = {0, -1, 0, 1};
int n;
void bfs(vector<vector<char>> v) {
vector<vector<int>> vis (n, vector<int>(n, 0));
queue<pair<int,int>> q;
int cnt = 0;
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
if(v[y][x] == 'R' || v[y][x] == 'G' || v[y][x] == 'B') {
if(vis[y][x] == 0) {
cnt++;
q.push({y, x});
vis[y][x] = 1;
while(!q.empty()) {
auto cur = q.front();
q.pop();
for(int i = 0; i < 4; i++){
int yy = cur.first + dy[i];
int xx = cur.second + dx[i];
if (yy > -1 && yy < n && xx > -1 && xx < n && v[cur.first][cur.second] == v[yy][xx] && vis[yy][xx] == 0 ) {
q.push({yy, xx});
vis[yy][xx] = 1;
}
}
}
}
}
}
}
cout << cnt << " ";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
vector<vector<char>> v(n, vector<char>(n));
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
char ch;
cin >> ch;
v[y][x] = ch;
}
}
bfs(v);
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
if (v[y][x] == 'G')
v[y][x] = 'R';
}
}
bfs(v);
return 0;
}'알고리즘' 카테고리의 다른 글
| [백준] C++ 2583번:영역 구하기! (0) | 2025.12.15 |
|---|---|
| [백준] C++ 5427번: 불! (0) | 2025.12.15 |
| [백준] C++ 7562번:나이트의 이동! (0) | 2025.12.15 |
| [백준] C++ 7569번:토마토! (0) | 2025.12.14 |
| [백준] C++ 1012번:유기농배추 (0) | 2025.12.14 |