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

 

3184번: 양

문제 미키의 뒷마당에는 특정 수의 양이 있다. 그가 푹 잠든 사이에 배고픈 늑대는 마당에 들어와 양을 공격했다. 마당은 행과 열로 이루어진 직사각형 모양이다. 글자 '.' (점)은 빈 필드를 의미하며, 글자 '#'는 울타리를, 'o'는 양, 'v'는 늑대를 의미한다. 한 칸에서 수평, 수직만으로 이동하며 울타리를 지나지 않고 다른 칸으로 이동할 수 있다면, 두 칸은 같은 영역 안에 속해 있다고 한다. 마당에서 "탈출"할 수 있는 칸은 어떤 영역에도 속하지

www.acmicpc.net

마당에 영역별로 양과 늑대가 있는데, 같은 영역 안에서 양이 늑대보다 더 많으면 싸워서 이길 수 있다.

마지막에 살아남은 양과 늑대의 수를 출력하는 문제이다.

 

먼저 각 영역에서의 양의 수와 늑대의 수를 구하기 위해서 bfs를 이용했다. bfs를 통해 연결된 영역을 구하면서

양이나 늑대가 있는 경우에 숫자를 카운트한다.

 

한 영역의 탐색이 끝난 후에 양의 수와 늑대의 수를 비교해준다.

양의 수가 많은 경우 전체 양의 수에 해당 영역의 양의 수를 더해준다.

그렇지 않은 경우 늑대의 수를 전체 늑대의 수에 더해주면 된다.

 

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
 
int r, c, sheep, wolf;
bool check[250][250];
char map[250][250];
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
 
void bfs(int x, int y) {
    queue<pair<intint>> q;
    q.push(make_pair(x, y));
    check[x][y] = true;
 
    int ocnt = 0;
    int vcnt = 0;
 
    //출발점이 양이나 늑대인 경우
    if (map[x][y] == 'o') {
        ocnt++;
    }
    else if (map[x][y] == 'v') {
        vcnt++;
    }
 
    while (!q.empty()) {
        x = q.front().first;
        y = q.front().second;
        q.pop();
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k];
            int ny = y + dy[k];
 
            //범위체크
            if (nx < 0 || ny < 0 || nx >= r || ny >= c) continue;
            
            //방문체크
            if (check[nx][ny]) continue;
 
            //울타리
            if (map[nx][ny] == '#'continue;
            
            q.push(make_pair(nx, ny));
            check[nx][ny] = true;
 
            //이동하는 곳에 양이 있는 경우 양의 수 증가
            if (map[nx][ny] == 'o') {
                ocnt++;
            }//이동하는 곳에 늑대가 있는 경우 늑대의 수 증가
            else if (map[nx][ny] == 'v') {
                vcnt++;
            }
        }
    }
 
 
    //탐색이 끝난 후에 양의 수가 더 많으면 양의 수를 전체 양의 수에 더한다.(양이 살아 남음)
    if (ocnt > vcnt) {
        sheep += ocnt;
    }
    else {//늑대의 수가 더 많거나 같은 경우 늑대가 살아남는다.
        wolf += vcnt;
    }
 
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
 
    cin >> r >> c;
 
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cin >> map[i][j];
        }
    }
 
 
 
    //영역별로 bfs를 실행
    //방문한 곳(다른 영역)이나 울타리는 탐색하지 않는다.
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (map[i][j] == '#'continue;
            if (check[i][j]) continue;
            bfs(i, j);
        }
    }
 
 
    cout << sheep << ' ' << wolf;
    
    return 0;
}
Colored by Color Scripter
 

'BOJ' 카테고리의 다른 글

[BOJ] 14620. 꽃길  (0) 2019.07.06
[BOJ] 14889. 스타트와 링크  (0) 2019.07.06
[BOJ] 1026. 보물  (0) 2019.07.06
[BOJ] 2210. 숫자판 점프  (0) 2019.07.03
[BOJ] 13458. 시험 감독  (0) 2019.07.03

+ Recent posts