반응형
https://www.acmicpc.net/problem/10026
[풀이과정]
1.R,G,B 각 글자에 대해서 FloodFill을 이용해서 글자가 상하좌우에 연결된 부분을 찾는다.
2.전체 맵을 각 글자의 묶음들이 있는 걸 count해서 R,G,B 각 글자에 대해서 숫자를 count한다.
3.적록 색맹을 경우는 R를 G로 변경하는 작업을 해 준다.
4.1번 부터 동일한 과정으로 R,G에 대한 count를 해주면 된다.
/*백준 10026 적록색약*/
#include<iostream>
#include<memory.h>
using namespace std;
#define MAXN (int)1e2+10
char map[MAXN][MAXN];
int visited[MAXN][MAXN];//방문 표시
int N;//행,열
int dy[]={-1,1,0,0};
int dx[]={0,0,-1,1};
bool isInside(int a, int b){
return ( (a>=0) && (a<N) && (b>=0) && (b<N));
}
bool DFS(int y, int x, char c){
if(isInside(y,x) && visited[y][x]==0 && map[y][x]==c){
visited[y][x]=1;
for(int i=0; i<4; i++){
DFS(y+dy[i],x+dx[i],c);
//cout<<y+dy[i]<<' '<<x+dx[i]<<endl;
}
return true;
}else{
return false;
}
}
int Calc(int c){
int cnt=0;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(map[i][j]==c)
cnt+=DFS(i,j,c);
}
}
return cnt;
}
void remap(){
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(map[i][j]=='R')
map[i][j]='G';
}
}
}
void Solve(){
int cnt1=0,cnt2=0;
cnt1+=Calc('R');
cnt1+=Calc('G');
cnt1+=Calc('B');
memset(visited,false,sizeof(visited));
remap();
cnt2+=Calc('G');
cnt2+=Calc('B');
cout<<cnt1<<' '<<cnt2<<endl;
}
void InputData(){
cin>>N;
for(int i=0; i<N; i++){
cin>>map[i];
}
}
int main(){
InputData();
Solve();
return 0;
}
반응형
'Algorithm > BFS,DFS' 카테고리의 다른 글
[C++][백준]1520 내리막길 (0) | 2022.04.10 |
---|---|
[C++][백준]14502 연구소 (0) | 2022.04.10 |
[c++][algoritm][baekjoon]7562 나이트의 이동 (0) | 2021.09.23 |
[c++][algorithm][baekjoon][7569]토마토 (0) | 2021.08.29 |
[c++][algorithm][baekjoon][11724]연결 요소의 개수 (0) | 2021.08.27 |