#include <functional>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct State
{
vector<int> values;
int result;
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
vector<int> sizes(3);
for(auto& size : sizes)
{
cin >> size;
}
vector<int> values(3);
for(auto& value : values)
{
cin >> value;
}
vector<vector<bool>> empty(3, vector<bool>(sizes[2] + 1)), full(3, vector<bool>(sizes[2] + 1));
vector<int> results(sizes[2] + 1, -1);
queue<State> states;
states.push({ values, 0 });
while(!states.empty())
{
vector<int> values = states.front().values;
int result = states.front().result;
//cout << "[STATE] (" << values[0] << ' ' << values[1] << ' ' << values[2] << ") IN " << result << endl;
states.pop();
for(int index = 0; index <= 2; index++)
{
if(results[values[index]] == -1)
{
results[values[index]] = result;
}
}
for(int source = 0; source <= 2; source++)
{
for(int destination = 0; destination <= 2; destination++)
{
if(source == destination)
{
continue;
}
if(values[source] + values[destination] >= sizes[destination])
{
vector<int> newValues = values;
newValues[destination] = sizes[destination];
newValues[source] += values[destination] - sizes[destination];
//cout << source << " -> " << destination << " (" << newValues[0] << ' ' << newValues[1] << ' ' << newValues[2] << ")" << endl;
int value = newValues[(destination + 1) % 3];
if(!full[destination][value])
{
full[destination][value] = true;
states.push({ newValues, result + 1 });
}
}
else
{
vector<int> newValues = values;
newValues[destination] += values[source];
newValues[source] = 0;
//cout << source << " -> " << destination << " (" << newValues[0] << ' ' << newValues[1] << ' ' << newValues[2] << ")" << endl;
int value = newValues[(source + 1) % 3];
if(!empty[source][value])
{
empty[source][value] = true;
states.push({ newValues, result + 1 });
}
}
}
}
}
for(auto value : results)
{
cout << value << ' ';
}
cout << '\n';
}
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 | #include <functional> #include <iostream> #include <vector> #include <queue> using namespace std; struct State { vector<int> values; int result; }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); vector<int> sizes(3); for(auto& size : sizes) { cin >> size; } vector<int> values(3); for(auto& value : values) { cin >> value; } vector<vector<bool>> empty(3, vector<bool>(sizes[2] + 1)), full(3, vector<bool>(sizes[2] + 1)); vector<int> results(sizes[2] + 1, -1); queue<State> states; states.push({ values, 0 }); while(!states.empty()) { vector<int> values = states.front().values; int result = states.front().result; //cout << "[STATE] (" << values[0] << ' ' << values[1] << ' ' << values[2] << ") IN " << result << endl; states.pop(); for(int index = 0; index <= 2; index++) { if(results[values[index]] == -1) { results[values[index]] = result; } } for(int source = 0; source <= 2; source++) { for(int destination = 0; destination <= 2; destination++) { if(source == destination) { continue; } if(values[source] + values[destination] >= sizes[destination]) { vector<int> newValues = values; newValues[destination] = sizes[destination]; newValues[source] += values[destination] - sizes[destination]; //cout << source << " -> " << destination << " (" << newValues[0] << ' ' << newValues[1] << ' ' << newValues[2] << ")" << endl; int value = newValues[(destination + 1) % 3]; if(!full[destination][value]) { full[destination][value] = true; states.push({ newValues, result + 1 }); } } else { vector<int> newValues = values; newValues[destination] += values[source]; newValues[source] = 0; //cout << source << " -> " << destination << " (" << newValues[0] << ' ' << newValues[1] << ' ' << newValues[2] << ")" << endl; int value = newValues[(source + 1) % 3]; if(!empty[source][value]) { empty[source][value] = true; states.push({ newValues, result + 1 }); } } } } } for(auto value : results) { cout << value << ' '; } cout << '\n'; } |
English