10026:적록색약

computer_log·2023년 9월 7일
0
  1. 적록색약 아닌사람의 숫자
#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로 바꿔서 체크를 해준다.

[궁금,,]
코드를 더 줄일수있는 방법 없나,,?

profile
computer_log

0개의 댓글