https://www.acmicpc.net/problem/10026
R, G, B가 연결되어 있는 구역을 각각 구한 다음에 구역의 개수가 총 몇 개인지 구하면 된다.
다만 적록색약인 경우에는 G와 R이 같다고 생각하고 풀면 되는데
아예 G를 R로 바꿔서 문제를 해결했다.
dfs를 호출하는 부분을 두 번 쓰면 소스 코드가 길어질 것 같아서
solve 함수를 이용해서 dfs를 호출할 수 있도록 했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <iostream> #include <vector> using namespace std; int N; int dy[4]={1,-1,0,0}; int dx[4]={0,0,1,-1}; vector<vector<char>> vec; vector<vector<bool>> visited; void dfs(int y,int x){ for(int i=0;i<4;i++){ int ny=y+dy[i]; int nx=x+dx[i]; if(ny<0 || ny>=N || nx<0 || nx>=N) continue; if(visited[ny][nx] || vec[y][x]!=vec[ny][nx]) continue; visited[ny][nx]=true; dfs(ny,nx); } } int solve(){ int cnt=0; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(!visited[i][j]){ visited[i][j]=true; dfs(i,j); cnt++; } } } return cnt; } int main(){ cin>>N; vec=vector<vector<char>> (N,vector<char> (N,0)); visited=vector<vector<bool>> (N,vector<bool> (N,false)); for(int i=0;i<N;i++) for(int j=0;j<N;j++) cin>>vec[i][j]; //적록 색약x int ans1=solve(); visited=vector<vector<bool>> (N,vector<bool> (N,false)); for(int i=0;i<N;i++) for(int j=0;j<N;j++) vec[i][j]=(vec[i][j]=='G')? 'R':vec[i][j]; //적록 색약o int ans2=solve(); cout<<ans1<<" "<<ans2<<endl; return 0; } | cs |
'알고리즘(BOJ) > DFS' 카테고리의 다른 글
백준 9486번 - 텀 프로젝트 (1) | 2018.02.09 |
---|---|
백준 2573번 - 빙산 (0) | 2018.01.31 |
백준 1707번 - 이분 그래프 (0) | 2018.01.28 |
백준 6603번 - 로또 (0) | 2018.01.28 |
백준 1987번 - 알파벳 (0) | 2018.01.28 |