728x90
문제 링크 https://www.acmicpc.net/problem/10026
다른 문제와 비슷하게 DFS순회할 때마다 카운트를 증가하는 문제이다.
다만, 적록색약의 경우 R과 G를 같은 것으로 보기 때문에,
정상인의 경우 -> R-R, G-G, B-B와 같이 같은 것을 만났을 때만 DFS순회를 하도록 하고,
적록색약의 경우 -> 정상인의 경우에 R-G, G-R 이 두가지 경우를 추가해주면 된다.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAX = 101;
using namespace std;
int n;
vector<string> arr;
bool visited[MAX][MAX];
int dir[4][2] = { {-1,0},{1,0},{0,1},{0,-1} };
int cnt1, cnt2;
void dfs(int x, int y, bool normal) {
for (int i = 0; i < 4; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (visited[nx][ny])
continue;
if (nx < 0 || nx >= n || ny < 0 || ny >= n)
continue;
if (normal == true) { //정상인의 경우 색이 같으면 DFS
if (arr[nx][ny] == arr[x][y]) {
visited[nx][ny] = true;
dfs(nx, ny, normal);
}
}
else { //적록색약의 경우 R와 G가 만나도 DFS
if ((arr[x][y] == 'R' && arr[nx][ny] == 'R') ||
(arr[x][y] == 'R' && arr[nx][ny] == 'G') ||
(arr[x][y] == 'G' && arr[nx][ny] == 'R') ||
(arr[x][y] == 'G' && arr[nx][ny] == 'G') ||
(arr[x][y] == 'B' && arr[nx][ny] == 'B')) {
visited[nx][ny] = true;
dfs(nx, ny, normal);
}
}
}
}
int main()
{
cin >> n;
arr.resize(n + 1);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
//정상인
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j]) {
visited[i][j] = true;
dfs(i, j, true);
cnt1++;
}
}
}
memset(visited, false, sizeof(visited));
//적록색약
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j]) {
visited[i][j] = true;
dfs(i, j, false);
cnt2++;
}
}
}
cout << cnt1 << " " << cnt2;
}
|
cs |
728x90
'Algorithm > BFS DFS' 카테고리의 다른 글
[백준] 2468 안전영역 c++ (0) | 2023.03.02 |
---|---|
[백준] 4963 섬의 개수 c++ (1) | 2023.03.01 |
[백준] 11724 연결 요소의 개수 c++ (0) | 2023.02.28 |
[백준] 1012 유기농 배추 c++ (0) | 2023.02.27 |
[백준] 2667 단지번호붙이기 c++ (0) | 2023.02.27 |
댓글