10026번 - 적록색약
간단하게 적록색약이 아닐때, 적록색약일 때 dfs를 두번 돌리면 된다.
map 을 다시 새로 만들거나 해도 되는데, 그냥 dfs2 라는 함수를 만들어서 문제를 풀었다.
BFS 로도 풀 수 있다.
<정답 코드>
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include<iostream> #include<string.h> using namespace std; int dx[4] = { 0,0,1,-1 }; int dy[4] = { 1,-1,0,0 }; char map[101][101]; bool check[101][101]; int n; void dfs(int x,int y,char z) { check[x][y] = true; for (int d = 0; d < 4; d++) { int nx = x + dx[d]; int ny = y + dy[d]; if (nx >= 0 && ny >= 0 && nx < n && ny < n && !check[nx][ny] && map[nx][ny]==z) { dfs(nx, ny, z); } } } void dfs2(int x, int y, char z) { check[x][y] = true; for (int d = 0; d < 4; d++) { int nx = x + dx[d]; int ny = y + dy[d]; if (nx >= 0 && ny >= 0 && nx < n && ny < n && !check[nx][ny]) { if (z == 'R' || z == 'G') { if (map[nx][ny] == 'R' || map[nx][ny] == 'G') { dfs2(nx, ny, z); } } else { if (map[nx][ny] == z) { dfs2(nx, ny, z); } } } } } int main() { //freopen("input.txt", "r", stdin); cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } int ans1=0, ans2 = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!check[i][j]) { ans1++; dfs(i, j,map[i][j]); } } } memset(check, false, sizeof(check)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!check[i][j]) { ans2++; dfs2(i, j, map[i][j]); } } } cout << ans1 <<" " <<ans2 << endl; return 0; } | cs |
반응형