728x90
    
    
  https://www.acmicpc.net/problem/2251
2251번: 물통
각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부을 수 있는데, 이때에는 한 물통이 비거나, 다른 한 물통이 가득 찰 때까지 물을 부을 수 있다. 이 과정에서 손실되는 물은 없다고 가정한다. 이와 같은 과정을 거치다보면 세 번째 물통(용량이 C인)에 담겨있는 물의 양이 변할 수도 있다.
www.acmicpc.net
총 6가지 경우의 수에 대해서 전부 bfs.
각각의 물 담긴 상태가 이미 저장되어 있으면 넘기고.
세가지 상태를 전부 저장하는 경우는 처음이었다.(pair 안의 pair을 활용해서 상태를 저장할 수 있다.)
| 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 | #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; int A,B,C; bool visited[201][201][201]; vector<int> bfs(void){     queue<pair<pair<int,int>,int>> q;     q.push(make_pair(make_pair(0,0),C));     vector<int> result;     while(!q.empty()){         int c = q.front().second;         q.pop();         if(visited[a][b][c]){             continue;         }         visited[a][b][c]=true;         if(a==0)             result.push_back(c);         //a->b         if (a + b > B) //안넘치는 범위에서 따라야함             q.push(make_pair(make_pair(a + b - B, B), c));         else //걍따라도 됨             q.push(make_pair(make_pair(0, a + b), c));         //a->c         if (a + c > C)             q.push(make_pair(make_pair(a + c - C, b), C));         else             q.push(make_pair(make_pair(0, b), a + c));         //b->a         if (b + a > A)             q.push(make_pair(make_pair(A, b + a - A), c));         else             q.push(make_pair(make_pair(b + a, 0), c));         //b->c         if (b + c > C)             q.push(make_pair(make_pair(a, b + c - C), C));         else             q.push(make_pair(make_pair(a, 0), b + c));         //c->a         if (c + a > A)             q.push(make_pair(make_pair(A, b), c + a - A));         else             q.push(make_pair(make_pair(c + a, b), 0));         //c->b         if (c + b > B)             q.push(make_pair(make_pair(a, B), c + b - B));         else             q.push(make_pair(make_pair(a, c + b), 0));     }     return result; } int main(void){     cin>>A>>B>>C;     vector<int> result = bfs();     sort(result.begin(),result.end());     for (int i = 0; i < result.size(); i++)         cout << result[i]<< " "; } http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter | 
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 2251 물통 - 세 쌍 벡터를 이용한 bfs (0) | 2020.02.10 | 
|---|---|
| 백준 10814 나이순 정렬 - c++ (0) | 2020.02.01 | 
| 1525 퍼즐 - bfs와 브루트포스 - c++ (0) | 2020.01.30 | 
| 백준 9019 DSLR : bfs 활용 브루트포스 탐색 c++ (0) | 2020.01.28 | 
| 백준 1963 - 소수경로 - bfs,몫 나머지 활용 - C++ (0) | 2020.01.28 | 
