Be a developer

백준 2251 물통 본문

알고리즘

백준 2251 물통

중국고대사 2019. 4. 9. 02:52

한 번에 한 통을 붓기 때문에 가중치가 1이다. 또한 visit 배열을 만든다고 할 때 200*200*200 = 8000000이므로 시간안에 풀 수 있는 문제이다.

bfs로 풀 수 있다. a에 들어 있는 물의 양이 0일 때는 queue에 다시 넣지 않고 답을 저장하는 vector에 넣을 것이고, 한 번 만들어진 경우는 visit 함수를 이용하여 다시 queue에 넣지 않을 것이므로 queue는 empty가 될 수밖에 없다.

 

푸는 방법은 어렵지 않지만, 경우의 수를 다 나누어 주는 것이 복잡하다.

코드는 아래와 같다.

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
111
112
113
114
115
116
117
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
 
bool visit[200][200][200];
 
 
 
int main(int argc, char** argv) {
    int a, b, c;
    cin >> a >> b >> c;
 
    vector<int> v;
    queue<tuple<intintint>> q;
    q.push(make_tuple(00, c));
 
    while (!q.empty()) {
        int x, y, z;
        tie(x, y, z) = q.front();
        q.pop();
 
        if (x == 0) {
            visit[x][y][z] = true;
            v.push_back(z);
        }
 
        if (x != 0) {
            if (b - y < x) {
                if (!visit[x - (b - y)][b][z]) {
                    visit[x - (b - y)][b][z] = true;
                    q.push(make_tuple(x - (b - y), b, z));
                }
            }
            if (b - y >= x) {
                if (!visit[0][x + y][z]) {
                    visit[0][x + y][z] = true;
                    q.push(make_tuple(0, x + y, z));
                }
            }
            if (c - z < x) {
                if (!visit[x - (c - z)][y][c]) {
                    visit[x - (c - z)][y][c] = true;
                    q.push(make_tuple(x - (c - z), y, c));
                }
            }
            if (c - z >= x) {
                if (!visit[0][y][x + z]) {
                    visit[0][y][x + z] = true;
                    q.push(make_tuple(0, y, x + z));
                }
            }
        }
        if (y != 0) {
            if (a - x < y) {
                if (!visit[a][y - (a - x)][z]) {
                    visit[a][y - (a - x)][z] = true;
                    q.push(make_tuple(a, y - (a - x), z));
                }
            }
            if (a - x >= y) {
                if (!visit[x + y][0][z]) {
                    visit[x + y][0][z] = true;
                    q.push(make_tuple(x + y, 0, z));
                }
            }
            if (c - z < y) {
                if (!visit[x][y - (c - z)][c]) {
                    visit[x][y - (c - z)][c] = true;
                    q.push(make_tuple(x, y - (c - z), c));
                }
            }
            if (c - z >= y) {
                if (!visit[x][0][y+z]) {
                    visit[x][0][y+z] = true;
                    q.push(make_tuple(x, 0, y+z));
                }
            }
        }
        if (z != 0) {
            if (a - x < z) {
                if (!visit[a][y][z - (a - x)]) {
                    visit[a][y][z - (a - x)] = true;
                    q.push(make_tuple(a, y, z - (a - x)));
                }
            }
            if (a - x >= z) {
                if (!visit[x + z][y][0]) {
                    visit[x + z][y][0= true;
                    q.push(make_tuple(x + z, y, 0));
                }
            }
            if (b - y < z) {
                if (!visit[x][b][z - (b - y)]) {
                    visit[x][b][z - (b - y)] = true;
                    q.push(make_tuple(x, b, z - (b - y)));
                }
            }
            if (b - y >= z) {
                if (!visit[x][y + z][0]) {
                    visit[x][y + z][0= true;
                    q.push(make_tuple(x, y + z, 0));
                }
            }
        }
    }
 
    sort(v.begin(), v.end());
    for (auto x : v) {
        printf("%d ", x);
    }
    printf("\n");
 
    return 0;
}
cs

'알고리즘' 카테고리의 다른 글

Java로 알고리즘 풀면서 명심할 사항들  (0) 2019.09.17
백준 12851 숨바꼭질 2  (0) 2019.04.09
백준 9019 DSLR  (0) 2019.04.08
백준 13913 숨바꼭질 4  (0) 2019.04.08
백준 3055 탈출  (0) 2019.04.08
Comments