10026-赤緑色盲-DFS
質問する
質問リンク:https://www.acmicpc.net/problem/10026
ポリシー
コード#コード#
#include<bits/stdc++.h>
using namespace std;
int N;
char a[102][102];
//체크배열
bool ch[102][102];
// 가로세로 이동을 위한 배열
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
int normalCnt = 0, oddCnt = 0;
// 일반적인 사람의 DFS
void nomalPeople(int r, int c, char color){
for(int i=0; i<4; i++){
int rr = r+dy[i];
int cc = c+dx[i];
if(a[rr][cc] == color && ch[rr][cc] == false){
ch[rr][cc] = true;
nomalPeople(rr, cc, color);
}
}
}
// 적록색맹의 DFS
void oddPeople(int r, int c, char color){
if(color == 'B'){
for(int i=0; i<4; i++){
int rr = r+dy[i];
int cc = c+dx[i];
if(a[rr][cc] == color && ch[rr][cc] == false){
ch[rr][cc] = true;
oddPeople(rr, cc, color);
}
}
}
else{
for(int i=0; i<4; i++){
int rr = r+dy[i];
int cc = c+dx[i];
if((a[rr][cc] == 'R' || a[rr][cc] == 'G') && ch[rr][cc] == false){
ch[rr][cc] = true;
oddPeople(rr, cc, color);
}
}
}
}
int main(){
ios_base::sync_with_stdio(false);
// freopen("../input.txt","rt",stdin);
cin >> N;
// 이미 처리한 문자는 #으로 바꾸기
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
cin >> a[i][j];
}
}
memset(ch, false, sizeof(ch));
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
if(ch[i][j] == false){
ch[i][j] = true;
nomalPeople(i, j, a[i][j]);
normalCnt++;
}
}
}
memset(ch, false, sizeof(ch));
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
if(ch[i][j] == false){
ch[i][j] = true;
oddPeople(i, j, a[i][j]);
oddCnt++;
}
}
}
cout << normalCnt << " " << oddCnt << '\n';
return 0;
}
感想
赤緑色盲の場合はparameterにcolorを与え,B時と非B時の2つの場合にコードを記述する.他の人はBFSで一度に処理しました.私もBFSを勉強します.
Reference
この問題について(10026-赤緑色盲-DFS), 我々は、より多くの情報をここで見つけました https://velog.io/@gomster_96/백준-문제번호-문제이름-알고리즘-f2b28lm9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol