Game Develop

[Algorithm] Baekjoon 3055번 : 탈출 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 3055번 : 탈출

MaxLevel 2023. 9. 15. 23:12

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

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net

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
struct Node
{
    int y;
    int x;
    bool isWater;
    int count;
};
 
int n, m;
char arr[50][50];
int dir[4][2= { {-1,0}, {1,0}, {0,-1}, {0,1} };
Node start;
vector<Node> waters;
 
bool checkInRange(int y, int x)
{
    if (y < 0 || y >= n || x < 0 || x >= m) return false;
    return true;
}
 
int BFS()
{
    queue<Node> q;
 
    for (int i = 0; i < waters.size(); ++i)
    {
        q.push(waters[i]);
    }
 
    q.push(start);
 
    while (!q.empty())
    {
        int curY = q.front().y;
        int curX = q.front().x;
        int curIsWater = q.front().isWater;
        int curCount = q.front().count;
        q.pop();
 
        for (int i = 0; i < 4++i)
        {
            int nextY = curY + dir[i][0];
            int nextX = curX + dir[i][1];
 
            if (!checkInRange(nextY, nextX)) continue;
            if (curIsWater)
            {
                if (arr[nextY][nextX] == 'S' || arr[nextY][nextX] == '.')
                {
                    arr[nextY][nextX] = '*';
                    q.push({ nextY,nextX,true,0 });
                }
            }
            else
            {
                if (arr[nextY][nextX] == '.')
                {
                    arr[nextY][nextX] = 'S';
                    q.push({ nextY,nextX,false,curCount + 1 });
                }
                else if (arr[nextY][nextX] == 'D')
                {
                    return curCount + 1;
                }
            }
        }
    }
    return -1;
}
 
int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> n >> m;
 
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            cin >> arr[i][j];
            if (arr[i][j] == '*')
            {
                waters.push_back({ i,j,true,0 });
            }
            else if (arr[i][j] == 'S')
            {
                start = { i,j,false,0 };
            }
        }
    }
 
    int result = BFS();
 
    if (result == -1cout << "KAKTUS";
    else cout << result;
}
cs

어렵지않긴한데, 관련유형을 많이 안풀어봤다면 살짝 고민할 수도 있다.

물이 차오를 예정인곳에는 고슴도치가 못간다는 조건만 잘 해결하면 된다.

이걸 쉽게 생각하면, 그냥 물을 먼저 퍼뜨리면 된다. 

그다음에 고슴도치차례때 그냥 물이있는 칸을 안가면 그만이다.

반복하다가 고슴도치차례때 다음칸이 목표지면 바로 return시키면 끝.