ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1303] 전쟁 - 전투
    BOJ 2021. 8. 30. 17:06

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

     

    1303번: 전쟁 - 전투

    첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

    www.acmicpc.net

    <문제>

    기본적인 BFS 문제에서, 입력이 붙어있는 문자열이고, W와 B모두 각각 탐색하고 각각의 위력의 합을 출력해야 한다.

    W로 bfs가 시작되면 W만 탐색하고, B로 bfs가 시작되면 B만 탐색해야 하며

    입력을 int로 변환하든, char을 그대로 사용하든 그 두개가 헷갈리지 않게만 주의하면 된다.

    <소스코드>

    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
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    int n, m;
    int a[101][101], dy[4= { 0,1,0,-1 }, dx[4= { 1,0,-1,0 };
    bool visit[101][101];
    int powerB, powerW;
    queue<int>q;
    void bfs(int sy, int sx) {
        while (!q.empty())q.pop();
        q.push(sy);
        q.push(sx);
        visit[sy][sx] = true;
        int i, ty, tx, y, x, cnt;
        cnt = 1;
        while (!q.empty()) {
            ty = q.front();
            q.pop();
            tx = q.front();
            q.pop();
            for (i = 0; i < 4; i++) {
                y = ty + dy[i];
                x = tx + dx[i];
                if (y < 0 || x < 0 || y >= n || x >= m)continue;
                if (visit[y][x] == false && a[y][x] == a[sy][sx]) {
                    q.push(y);
                    q.push(x);
                    visit[y][x] = true;
                    cnt++;
                }
            }
        }
        if (a[sy][sx] == 1) {//W
            powerW += (cnt * cnt);
        }
        else if (a[sy][sx] == 2) {//B
            powerB += (cnt * cnt);
        }
        return;
    }
    int main(void) {
        int i, j;
        char s[101= { 0 };
        scanf("%d %d"&m, &n);
        for (i = 0; i < n; i++) {
            scanf("%s", s);
            for (j = 0; s[j]; j++) {
                if (s[j] == 'W')a[i][j] = 1;
                else if (s[j] == 'B')a[i][j] = 2;
                s[j] = 0;
            }
        }
        memset(visit, falsesizeof(visit));
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                if (visit[i][j] == false) {
                    bfs(i, j);
                }
            }
        }
        printf("%d %d", powerW, powerB);
        return 0;
    }
     
    cs

     

    다음 탐색을 진행할때에, a[y][x]==a[sy][sx]라는 조건이 추가되었고(26라인)

    W는 1, B는 2의 값을 갖는 int형 배열로 입력을 바꿔주었다.

    'BOJ' 카테고리의 다른 글

    [15685] 드래곤 커브  (0) 2021.08.30
    [10451] 순열 사이클  (0) 2021.08.30
    [5557] 1학년  (0) 2021.08.30
    [2212] 센서  (0) 2021.08.30
    [2470] 두 용액  (0) 2021.08.27

    댓글