반응형
백준 알고리즘
DFS
C++
https://www.acmicpc.net/problem/10026
10026번: 적록색약
문제 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은
www.acmicpc.net
#include <iostream>
#include <algorithm>
using namespace std;
int T;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,-1,0,1 };
char map[101][101];
int visited[100][100] = { 0, };
int visited_rg[100][100] = { 0, };
void dfs(int x, int y, char c);
void dfs_rg(int x, int y, char c);
int main() {
int count = 0, count_rg = 0;
cin >> T;
for (int i = 0; i < T; i++) {
cin >> map[i];
}
for (int i = 0; i < T; i++) {
for (int j = 0; j < T; j++) {
if (visited[i][j] == 0) {
count++;
dfs(i, j, map[i][j]);
}
}
}
for (int i = 0; i < T; i++) {
for (int j = 0; j < T; j++) {
if (visited_rg[i][j] == 0) {
count_rg++;
dfs_rg(i, j, map[i][j]);
}
}
}
cout << count << ' ' << count_rg;
return 0;
}
void dfs(int x, int y, char c) {
visited[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0 <= nx && nx < T && 0 <= ny && ny < T) {
if (map[nx][ny] == c && visited[nx][ny] == 0) {
dfs(nx, ny, c);
}
}
}
}
void dfs_rg(int x, int y, char c) {
visited_rg[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0 <= nx && nx < T && 0 <= ny && ny < T) {
if (visited_rg[nx][ny] == 0) {
if (c == 'B' && map[nx][ny] == c) {
dfs_rg(nx, ny, c);
}
if (c != 'B' && (map[nx][ny] == 'R' || map[nx][ny] == 'G')) {
dfs_rg(nx, ny, c);
}
}
}
}
}
반응형
'코딩테스트 문제풀이 > 백준' 카테고리의 다른 글
[백준] 별 찍기 - 10 (0) | 2021.04.06 |
---|---|
[백준][BFS] 토마토 (0) | 2020.03.01 |
[백준][DFS] 경로찾기 (0) | 2020.03.01 |