하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 3184 양 C++

긤효중 2022. 8. 23. 23:39

https://www.acmicpc.net/problem/3184

 

3184번: 양

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

www.acmicpc.net


문제

미키의 뒷마당에는 특정 수의 양이 있다. 그가 푹 잠든 사이에 배고픈 늑대는 마당에 들어와 양을 공격했다.

마당은 행과 열로 이루어진 직사각형 모양이다. 글자 '.' (점)은 빈 필드를 의미하며, 글자 '#'는 울타리를, 'o'는 양, 'v'는 늑대를 의미한다.

한 칸에서 수평, 수직만으로 이동하며 울타리를 지나지 않고 다른 칸으로 이동할 수 있다면, 두 칸은 같은 영역 안에 속해 있다고 한다. 마당에서 "탈출"할 수 있는 칸은 어떤 영역에도 속하지 않는다고 간주한다.

다행히 우리의 양은 늑대에게 싸움을 걸 수 있고 영역 안의 양의 수가 늑대의 수보다 많다면 이기고, 늑대를 우리에서 쫓아낸다. 그렇지 않다면 늑대가 그 지역 안의 모든 양을 먹는다.

맨 처음 모든 양과 늑대는 마당 안 영역에 존재한다.

아침이 도달했을 때 살아남은 양과 늑대의 수를 출력하는 프로그램을 작성하라.


입력

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다.

다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.


울타리가 아니면 DFS 탐색으로 영역에 있는 양과 늑대의 개수를 찾아준다.

영역 내의 양의 수가 늑대의 수보다 많으면 전체 양의 개수에 현재 영역 양의 수를 더하고,

그 외의 경우 (늑대가 많은 경우)에는 전체 늑대의 개수에 현재 늑대의 수를 더해준다.

 

#include <iostream>
using namespace std;
 
int r,c;
bool visited[251][251];
char map[251][251];
 
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
 
int total_sheep = 0;
int total_wolf = 0;
int current_wolf = 0;
int current_sheep = 0;
 
void dfs(int x,int y){
 
    if(map[x][y] == 'o'){
        current_sheep++;
    }
    else if(map[x][y] == 'v'){
        current_wolf++;
    }
 
    visited[x][y] = true;
    for(int i = 0;i<4;i++){
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx < 0 || ny < 0 || nx >= r || ny >= c){
            continue;
        }
        char c = map[nx][ny];
 
        if(visited[nx][ny] == false && c != '#'){
            dfs(nx,ny);
        }
    }
 
}
 
int main(void){
    cin >> r >> c;
    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++){
            current_wolf = 0;
            current_sheep = 0;
            if(visited[i][j] == false && map[i][j] != '#'){
                dfs(i,j);
                if(current_sheep > current_wolf){
                    total_sheep += current_sheep;
                }
                else{
                    total_wolf += current_wolf;
                }
            }
        }
    }
    cout << total_sheep << ' ' << total_wolf;
}