ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 16956번 : 늑대와 양 (C 언어)
    c c++ 언어 공부 2023. 9. 19. 13:42

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

     

    16956번: 늑대와 양

    크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게

    www.acmicpc.net

    Code:

    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 <stdio.h>
     
    int r, c;
    char arr[500][500= { 0, };
    int dx[] = { -1,1,0,0 };
    int dy[] = { 0,0,-1,1 };
    int flag = 0;
     
    void dfs(int y, int x)
    {
        for (int i = 0; i < 4; i++)
        {
            int y_n = y + dy[i];
            int x_n = x + dx[i];
           if (arr[y_n][x_n] == 'W')
           {
                    flag = 1;
                    return;
           }
        }
    }
     
    int main()
    {
        int r, c;
        scanf("%d %d"&r, &c);
        for (int i = 0; i < r; i++)
        {
            scanf("%s", arr[i]);
        }
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                if (arr[i][j] == '.')
                {
                    arr[i][j] = 'D';
                }
            }
        }
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                if (arr[i][j] == 'S')
                {
                    dfs(i, j);
                    if (flag == 1)
                    {
                        break;
                    }
                }
            }
            if (flag == 1)
            {
                break;
            }
        }
        if (flag == 0)
        {
            printf("1\n");
            for (int i = 0; i < r; i++)
            {
                for (int j = 0; j < c; j++)
                {
                    printf("%c", arr[i][j]);
                }
                printf("\n");
            }
        }
        else if (flag == 1)
        {
            printf("0");
        }
    }
    cs

    문제 설명

    크기가 R×C인 목장에서는 각 칸마다 비어있는 칸('.'), 양('S'), 늑대('W')가 있습니다. 양은 그 위치에서 가만히 있고, 늑대는 인접한 칸으로 자유롭게 이동할 수 있습니다. 이때, 목장에 울타리를 설치하여 늑대가 양이 있는 칸으로 갈 수 없게 하려고 합니다. 울타리를 설치하면 해당 칸을 'D'로 표시합니다. 목장을 탈출할 수 있는 경우에는 '1'을 출력하고, 그렇지 않으면 '0'을 출력합니다.

    해결 방법

    우선 최소 개수의 울타리가 아니므로 모든 '.' 위치에 울타리를 설치했습니다.

    1. 목장 탐색 및 울타리 설치
      • 주어진 목장을 탐색하면서 양('S') 주변에 늑대('W')가 있는지 확인합니다. 양의 주변에 늑대가 있으면 울타리를 설치하여 양과 늑대를 분리합니다. 울타리는 해당 칸을 'D'로 표시합니다.
    2. 결과 출력
      • 양 주변에 늑대가 없는 상태로 목장을 정리하였으면 '1'을 출력하고, 정리한 목장의 상태를 출력합니다.
      • 양 주변에 늑대가 있어서 목장을 정리할 수 없는 경우에는 '0'을 출력합니다.

Designed by Tistory.