Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[백준] 16236 - 아기 상어 본문

Algorithms/BFS

[백준] 16236 - 아기 상어

꼬지마루 2018. 11. 8. 14:52

이 문제를 풀면서 거의 두 시간정도 아기상어 노래를 부른거 같닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


문제를 이해하고 구현하는데 1시간 걸렸는데....


풀고보니 내가 이해한건 90퍼 였다


나머지 10퍼는 디버깅하면서 찾느라 30분 정도 걸림....


자 문제의 조건에 대해서 생각하며 BFS탐색과 메모이제이션?이라고 해야하나...만족하는 값을 저장하고 갱신하는 방법으로 진행했다.


1. BFS탐색을 통해 최단거리 내의(맨위, 맨 왼쪽->문제의 조건을 만족하는 지점)의 갈 수 있는 곳을 찾는다.


2. 찾았다면 갈 수 있는 지점이라 판단, list에 저장한다.


3. 계속 BFS 탐색이 종료되면 문제의 조건에 맞게 sort한다.


4. 저장된 list[0].dis를 리턴함으로서 거리를 더해 주고, 그 위치를 map에서 삭제한다.


5. 먹은 물고기 갯수가 아기 상어의 크기와 같아지면 크기를 더해주고, 먹은 갯수를 0으로 만들어 준다.


6. 이 과정을 BFS함수가 리턴되는 값이 0이 되면 멈추고 답을 출력한다.


두 시간동안 삽질한 문제지만 애귀상어 노래를 부르며 즐겁게 풀 수 있었다 ㅎㅎ



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
#include <iostream>
#include <cmath>
#include <algorithm>
#define MX 22
using namespace std;
 
struct QUEUE {
    int x, y, dis;
}q[MX*MX];
 
struct SHARK {
    int x, y, k, ate;
}shark;
 
bool com(const QUEUE i, const QUEUE j)
{
    return (i.dis < j.dis) || (i.dis == j.dis && i.y < j.y) || (i.dis == j.dis && i.y == j.y && i.x < j.x);
}
 
int map[MX][MX], numcheck[MX][MX];
int dx[] = { 0-11};
int dy[] = { -100};
int N, M, dab, nx, ny;
 
int bfs()
{
    int st, ed, ix, iy, point, check[MX][MX] = { };
    QUEUE list[MX*MX] = { };
    st = ed = point = -1;
    q[++st].x = shark.x; q[st].y = shark.y; check[shark.y][shark.x] = 1;
 
    while (st != ed)
    {
        ix = q[++ed].x; iy = q[ed].y;
        if (< map[iy][ix] && map[iy][ix] < shark.k) { list[++point].x = ix; list[point].y = iy; list[point].dis = check[iy][ix] - 1; }
        for (int i = 0; i < 4; i++)
        {
            nx = ix + dx[i]; ny = iy + dy[i];
            if (nx < || ny < || nx >= N || ny >= N || check[ny][nx] || map[ny][nx] > shark.k) continue;
            q[++st].x = nx; q[st].y = ny; check[ny][nx] = check[iy][ix] + 1;
        }
    }
    sort(list, list + (point + 1), com);
    shark.x = list[0].x; shark.y = list[0].y;
    return list[0].dis;
}
 
int main(void)
{
    cin >> N;
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            cin >> map[i][j];
            if (map[i][j] == 9) { shark.k = 2; shark.x = j; shark.y = i; map[i][j] = 0; }
        }
    while (true)
    {
        int dis = bfs();
        if (!dis) break;
        else shark.ate++;
        if (shark.k == shark.ate) { shark.k++; shark.ate = 0; }
        dab += dis;
        map[shark.y][shark.x] = 0;
    }
    cout << dab << endl;
    return 0;
}
cs

'Algorithms > BFS' 카테고리의 다른 글

[백준] 17142 - 연구소3  (0) 2019.07.27
[백준] 16234 - 인구 이동  (0) 2018.11.08
[백준] 2667 - 단지번호 붙이기  (0) 2018.10.17
[SWEA] 5521 - 상원이의 생일파티  (0) 2018.09.07
[SWEA] 1267 - 작업순서  (0) 2018.09.03