#include <iostream>
using namespace std;
int N;
char map[101][101];
int visited[101][101];
int direct[4][2] = {
-1,0,
1,0,
0,1,
0,-1
};
int cnt = 0;
void run(int y, int x) {
for (int t = 0; t < 4; t++) {
int dy = y + direct[t][0];
int dx = x + direct[t][1];
if (dy < 0 || dx < 0 || dx >= N || dy >= N)continue;
if (map[dy][dx] == 'R' && visited[dy][dx] == 0) {
visited[dy][dx] = 1;
run(dy, dx);
}
}
}
int main() {
freopen_s(new FILE*, "input.txt", "r", stdin);
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j] == 0 && map[i][j] == 'R') {
visited[i][j] = 1;
run(i, j);
cnt++;
}
}
}
cout << cnt;
return 0;
}
2.적록색약인사람까지 포함
#include <iostream>
using namespace std;
int N;
char map[101][101];
int visited[101][101];
int direct[4][2] = {
-1,0,
1,0,
0,1,
0,-1
};
int cnt1 = 0;
int cnt2 = 0;
int Rvisited[101][101];
void run(int y, int x,char check) {
for (int t = 0; t < 4; t++) {
int dy = y + direct[t][0];
int dx = x + direct[t][1];
if (dy < 0 || dx < 0 || dx >= N || dy >= N)continue;
if (map[dy][dx] ==check && visited[dy][dx] == 0) {
visited[dy][dx] = 1;
run(dy, dx,check);
}
}
}
void run2(int y, int x, char check) {
for (int t = 0; t < 4; t++) {
int dy = y + direct[t][0];
int dx = x + direct[t][1];
if (dy < 0 || dx < 0 || dx >= N || dy >= N)continue;
if (map[dy][dx] == 'G')map[dy][dx] = 'R';
if (map[dy][dx] == check && Rvisited[dy][dx] == 0) {
Rvisited[dy][dx] = 1;
run2(dy, dx, check);
}
}
}
int main() {
freopen_s(new FILE*, "input.txt", "r", stdin);
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j] == 0 && map[i][j] == 'R') {
visited[i][j] = 1;
run(i, j,'R');
cnt1++;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j] == 0 && map[i][j] == 'B') {
visited[i][j] = 1;
run(i, j,'B');
cnt1++;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j] == 0 && map[i][j] == 'G') {
visited[i][j] = 1;
run(i, j,'G');
cnt1++;
}
}
}
cout << cnt1 << " ";
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (Rvisited[i][j] == 0 && map[i][j] == 'R'||map[i][j]=='G') {
Rvisited[i][j] = 1;
run2(i, j, 'R');
cnt2++;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (Rvisited[i][j] == 0 && map[i][j] == 'B') {
Rvisited[i][j] = 1;
run2(i, j, 'B');
cnt2++;
}
}
}
cout << cnt2 << "\n";
return 0;
}
[아이디어]
적록색약인 부분은 R이거나 G일때, 함수로 보낼때 R로 보내고,
함수에서 map부분에서 G이 나오면 R로 바꿔서 체크를 해준다.
[궁금,,]
코드를 더 줄일수있는 방법 없나,,?