[백준/C++] 10026번 적록색약
2021. 3. 30. 17:16ㆍ알고리즘/BFS DFS
728x90
반응형
문제: www.acmicpc.net/problem/10026
10026번: 적록색약
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)
www.acmicpc.net
문제풀이
BFS 알고리즘 문제이다.
큐와 방문여부배열, 영역개수를 2개씩 선언하여 하나는 색약이 아닌 사람 다른 하나는 색약인 사람의 영역 개수를 구하였다.
코드
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
int visited1[100][100] = {0,};
int visited2[100][100] = {0,};
string board[100];
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int n;
cin>>n;
for(int i=0; i<n; i++){
cin>>board[i];
}
int cnt1 = 0;
int cnt2 = 0;
queue<pair<int,int>> q1;
queue<pair<int,int>> q2;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(visited1[i][j] == 0){ //색약x
q1.push({i,j});
visited1[i][j] = 1;
cnt1++;
}
if(visited2[i][j] == 0){ //색약o
q2.push({i,j});
visited2[i][j] = 1;
cnt2++;
}
while(!q1.empty()){
pair<int,int> cur = q1.front();
q1.pop();
for(int dir=0; dir<4; dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0||nx>=n||ny<0||ny>=n) continue;
if(visited1[nx][ny]||board[cur.first][cur.second] != board[nx][ny]) continue;
visited1[nx][ny] = 1;
q1.push({nx,ny});
}
}
while(!q2.empty()){
pair<int,int> cur = q2.front();
q2.pop();
for(int dir=0; dir<4; dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0||nx>=n||ny<0||ny>=n) continue;
if(visited2[nx][ny]) continue;
if((board[cur.first][cur.second] == 'B' || board[nx][ny] == 'B') && board[cur.first][cur.second] != board[nx][ny]) continue;
visited2[nx][ny] = 1;
q2.push({nx,ny});
}
}
}
}
cout<<cnt1<<" "<<cnt2;
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 2573번 빙산 (0) | 2021.03.31 |
---|---|
[백준/C++] 5427번 불 (0) | 2021.03.31 |
[백준/C++] 2468번 안전 영역 (0) | 2021.03.30 |
[백준/C++] 2667번 단지번호붙이기 (0) | 2021.03.29 |
[백준/C++] 7562번 나이트의 이동 (0) | 2021.03.29 |