백준 16236번 : 아기 상어 /C++

2023. 3. 30. 00:37개인공부/코딩테스트

16236번: 아기 상어 (acmicpc.net)

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net


아기상어의 크기가 9초과이면 시간초과가 발생했는데 자기 자신이 9이기때문에 자시 자신을 먹어서 무한루프가 발생했다.

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
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <queue>
using namespace std;
 
int N;
int arr[20][20]{};
pair<intint> SharkPos;
int SharkSize = 2;
int SharkSizeUpCount = 0;
int ans = 0;
 
int BFS()
{
    bool visited[20][20]{};
    queue<pair<intint>> Q;
    Q.push(SharkPos);
    visited[SharkPos.first][SharkPos.second] = true;
    int Time = 0;
    while (!Q.empty())
    {
        queue<pair<intint>> tmp;
        while (!Q.empty())
        {
            int row = Q.front().first;
            int col = Q.front().second;
            if (arr[row][col] != 0 && arr[row][col] < SharkSize) { // 먹이를 찾음
                Q.pop();
                while (!Q.empty())
                {
                    int Row = Q.front().first;
                    int Col = Q.front().second;
                    if (arr[Row][Col] != 0 && arr[Row][Col] < SharkSize) {
                        if (Row < row) {
                            row = Row; col = Col;
                        }
                        else if (Row == row && Col < col) {
                            row = Row;
                            col = Col;
                        }
                    }
                    Q.pop();
                }
                arr[SharkPos.first][SharkPos.second] = 0;
                arr[row][col] = 0;
                ++SharkSizeUpCount;
                if (SharkSize == SharkSizeUpCount) {
                    ++SharkSize;
                    SharkSizeUpCount = 0;
                }
                SharkPos = { row,col };
                return Time;
            }
 
            // up row-1
            if (row > 0 && arr[row-1][col] <= SharkSize && !visited[row-1][col]) {
                visited[row-1][col] = true;
                tmp.push(make_pair(row-1, col));
            }
            // left col-1
            if (col > 0 && arr[row][col-1<= SharkSize && !visited[row][col-1]) {
                visited[row][col-1= true;
                tmp.push(make_pair(row, col-1));
            }
            // right col-1
            if (col+1< N && arr[row][col+1<= SharkSize && !visited[row][col+1]) {
                visited[row][col+1= true;
                tmp.push(make_pair(row, col+1));
            }
            // down row+1
            if (row + 1 < N && arr[row + 1][col] <= SharkSize && !visited[row + 1][col]) {
                visited[row + 1][col] = true;
                tmp.push(make_pair(row + 1, col));
            }
            Q.pop();
        }
        Q = tmp;
        ++Time;
    }
 
    return -1;
}
 
void Solve()
{
    // BFS로 먹이 탐색
    while (true)
    {
        int num =BFS();
        if (num == -1)
            break;
        ans += num;
    }
}
 
int main()
{
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> N;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j) {
            cin >> arr[i][j];
            if (arr[i][j] == 9)
                SharkPos = { i,j };
        }
 
    Solve();
    cout << ans;
}
 
 
cs