https://www.acmicpc.net/problem/10026
- 적록색약인 사람은 붉은색과 초록색을 같은 색으로 보기 때문에 기존에 입력했던 2차원 배열에서 'G' 값을 'R'로 변경하여 한번 더 BFS를 실행하였음
코드
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define MAX 101
#define _X first
#define _Y second
char board[MAX][MAX];
bool visited[MAX][MAX];
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };
int N;
char color;
int rgbCount, colorBlindCount;
void Bfs(int x, int y, char color)
{
queue<pair<int, int>> q;
q.push({ x, y });
visited[x][y] = true;
while (!q.empty())
{
pair<int, int> cur = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
int nx = cur._X + dx[i];
int ny = cur._Y + dy[i];
if (board[nx][ny] != color || visited[nx][ny]) continue;
if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
q.push({ nx, ny });
visited[nx][ny] = true;
}
}
}
// bfs 실행하여 총 그림 영역의 수를 반환하는 함수이다.
int GetCount(char arr[][MAX])
{
int cnt = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
color = arr[i][j];
if (!visited[i][j] && arr[i][j] == color)
{
Bfs(i, j, color);
cnt++;
}
}
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
// 크기 입력
cin >> N;
// 그림 입력
for (int i = 0; i < N; i++)
{
string str;
cin >> str;
for (int j = 0; j < N; j++)
{
board[i][j] = str[j];
}
}
// 적록색약이 아닌 사람이 보는 그림 영역의 수 구하기
rgbCount = GetCount(board);
// 방문 배열 초기화
memset(visited, false, sizeof(visited));
// 적록색약인 사람은 붉은색=초록색으로 인식하기 때문에
// 초록색 그림이 위치한 곳을 붉은색 그림으로 변경
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (board[i][j] == 'G')
board[i][j] = 'R';
}
}
// 적록색약인 사람이 보는 그림 영역의 수 구하기
colorBlindCount = GetCount(board);
// 출력
cout << rgbCount << ' ' << colorBlindCount;
}
'C++ > BFS, DFS' 카테고리의 다른 글
[C++] 백준 5014 - 스타트 링크 (0) | 2022.12.06 |
---|---|
[c++] 백준 2468 - 안전 영역 (1) | 2022.12.06 |
[C++] 백준 1303 - 전투 (0) | 2022.11.30 |
[C++] 백준 1012 - 유기농 배추 (1) | 2022.11.30 |
[C++] 백준 1260 - BFS와 DFS (0) | 2022.11.28 |