반응형
오랜만에 풀어보는 그래프탐색 문제
한 개의 dfs함수를 만들어서 문제를 해결 해 보고 싶었지만
결국 두개로 나누어 만들어 문제를 해결했다.
한개로 합쳐 만들 수 있을까?
#include<iostream>
#include<queue>
#include<string>
using namespace std;
char map[100][100];
bool visit[100][100];
bool visitColor[100][100];
int N;
int colorWeak = 0;
int normal = 0;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
void dfs(int x, int y) {
// 정상일 때의 dfs탐색
visit[x][y] = true;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < N && ny >= 0 && ny < N) {
// 각각 현재의 색과 다음의 탐색하려는 색깔의 색이 일치할 때 다음 탐색을 시작한다.
if(map[x][y] == 'R' && map[nx][ny] == 'R' && visit[nx][ny] == false) {
dfs(nx, ny);
} else if(map[x][y] == 'G' && map[nx][ny] == 'G' && visit[nx][ny] == false) {
dfs(nx, ny);
} else if(map[x][y] == 'B' && map[nx][ny] == 'B' && visit[nx][ny] == false) {
dfs(nx, ny);
}
}
}
}
void dfsColor(int x, int y) {
// 색약이 있을 때의 dfs탐색
visitColor[x][y] = true;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < N && ny >= 0 && ny < N) {
// 적색과 녹색의 색이 동일하다고 느끼므로 다음과 같이 탐색을 실행한다.
if((map[x][y] == 'R' || map[x][y] == 'G')
&& (map[nx][ny] == 'R' || map[nx][ny] == 'G')
&& visitColor[nx][ny] == false)
{
dfsColor(nx, ny);
} else if(map[x][y] == 'B' && map[nx][ny] == 'B' && visitColor[nx][ny] == false) {
dfsColor(nx, ny);
}
}
}
}
int main() {
cin >> N;
for(int i = 0; i < N; i++) {
string temp;
cin >> temp;
for(int j = 0; j < N; j++) {
map[i][j] = temp[j];
}
}
// 탐색을 다르게 하는 두개의 dfs함수를 만들어 실행하였다.
// 한개로 바꿀 수 있는 방법이 있을까?
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
if(visit[i][j] == false) {
normal++;
dfs(i, j);
}
if(visitColor[i][j] == false) {
colorWeak++;
dfsColor(i, j);
}
}
}
printf("%d %d\n", normal, colorWeak);
return 0;
}
반응형
'BaekJoon > C++' 카테고리의 다른 글
2108 : 통계학 (C++) (0) | 2021.02.16 |
---|---|
10866 : 덱 (C++) (0) | 2021.02.16 |
18111 : 마인크래프트 (C++) (0) | 2021.02.12 |
1920 : 수 찾기 (C++) (0) | 2021.02.11 |
2805 : 나무 자르기 (C++) (0) | 2021.02.10 |
댓글