https://www.acmicpc.net/problem/3184
백준에는 BFS로 분류되어 있지만
단순하게 마당별로 완전 탐색으로도 풀 수 있어서 DFS로 문제를 분류했다.
(사실 BFS가 큐에 담는 다는 것 외에는 접근 방식은 동일하다)
풀이 방식은 다음과 같다.
1) 해당 칸이 '#' 인지, 방문을 했는지 체크한다.
2) 만약 '#'이거나 방문을 했다면 1번으로 돌아가 다음 칸을 체크한다.
3) 만약 '#'이 아니며 방문을 하지 않았다면 해당 칸의 인접한 4개의 칸을 탐색한다.
4) 탐색이 끝났을 때, 한 마당에서 양과 늑대의 수를 비교해 더 큰 값을 최종적인 양과 늑대의 수에 더해준다.
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 | #include <iostream> #include <vector> using namespace std; vector<vector<char>> map; vector<vector<int>> visited; int dy[4]={1,-1,0,0}; int dx[4]={0,0,1,-1}; int R,C; int total_sheep_cnt=0; //최종 양의 수 int total_wolf_cnt=0; //최종 늑대 수 int sheep_cnt=0; //마당에 있는 양의 수 int wolf_cnt=0; //마당에 있는 늑대 수 void dfs(int y,int x){ if(map[y][x]=='o') sheep_cnt++; else if(map[y][x]=='v') wolf_cnt++; for(int dir=0;dir<4;dir++){ int ny=y+dy[dir]; int nx=x+dx[dir]; if(ny<0 || ny>=R || nx<0 || nx>=C) continue; if(map[ny][nx]=='#' || visited[ny][nx]) continue; visited[ny][nx]++; dfs(ny,nx); } } int main(){ cin>>R>>C; map=vector<vector<char>> (R,vector<char>(C,0)); visited=vector<vector<int>> (R,vector<int>(C,0)); for(int i=0;i<R;i++){ for(int j=0;j<C;j++){ cin>>map[i][j]; } } for(int i=0;i<R;i++){ for(int j=0;j<C;j++){ if(map[i][j]!='#' && !visited[i][j]){ visited[i][j]++; sheep_cnt=0; wolf_cnt=0; dfs(i,j); if(sheep_cnt>wolf_cnt) total_sheep_cnt+=sheep_cnt; else total_wolf_cnt+=wolf_cnt; } } } cout<<total_sheep_cnt<<" "<<total_wolf_cnt<<endl; return 0; } | cs |
'알고리즘(BOJ) > DFS' 카테고리의 다른 글
백준 16986번 - 인싸들의 가위바위보 (0) | 2019.08.18 |
---|---|
백준 15684번 - 사다리조작 (0) | 2019.08.18 |
백준 16198번 - 에너지 모으기 (0) | 2019.07.18 |
백준 9521번 - 색칠 공부 (0) | 2019.06.18 |
백준 17136번 - 색종이 붙이기 (0) | 2019.04.14 |