传送门:https://nanti.jisuanke.com/t/31
时间限制1000ms 内存限制65536K
无脑博士有三个容量分别是 A,B,C 升的试管,A,B,C 分别是三个从 1 到 20 的整数,最初,A 和 B 试管都是空的,而 C 试管是装满硫酸铜溶液的。有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试管装满或原试管空了。当然每一次灌注都是完全的。由于无脑博士天天这么折腾,早已熟练,溶液在倒的过程中不会有丢失。
写一个程序去帮助无脑博士找出当 A 试管是空的时候,C 试管中硫酸铜溶液所剩量的所有可能性。
输入格式
输入包括一行,为空格分隔开的三个数,分别为整数 A,B,C。
输出格式
输出包括一行,升序地列出当 A 试管是空的时候,C 试管溶液所剩量的所有可能性。
样例输入
2 5 10
样例输出
5 6 7 8 9 10
#include <iostream>
#include <cstdio>
#include <set>
unsigned int A, B, C;
std::set<unsigned int> fin;
const unsigned int num = 25;
bool flag[num][num][num] = {false};
void DFS(unsigned int a, unsigned int b, unsigned int c);
int main()
{
scanf("%d %d %d", &A, &B, &C);
DFS(0, 0, C);
for (std::set<unsigned int>::iterator it = fin.begin(); it != --fin.end(); ++it)
std::cout << *it << " ";
std::cout << *(--fin.end());
return 0;
}
bool can(unsigned int x, unsigned int y, unsigned int X, unsigned int Y, int * temp) {
if (x == 0 || y == Y) return false;
if (Y - y >= x) {
y += x;
x = 0;
}
else {
x -= Y - y;
y = Y;
}
temp[0] = x;
temp[1] = y;
return true;
}
void DFS(unsigned int a, unsigned int b, unsigned int c) {
if (flag[a][b][c]) return;
if (a == 0) fin.insert(c);
flag[a][b][c] = true;
int temp[2];
// a -> b
if (can(a, b, A, B, temp)) DFS(temp[0], temp[1], c);
// a -> c
if (can(a, c, A, C, temp)) DFS(temp[0], b, temp[1]);
// b -> a
if (can(b, a, B, A, temp)) DFS(temp[1], temp[0], c);
// b -> c
if (can(b, c, B, C, temp)) DFS(a, temp[0], temp[1]);
// c -> a
if (can(c, a, C, A, temp)) DFS(temp[1], b, temp[0]);
// c -> b
if (can(c, b, C, B, temp)) DFS(c, temp[1], temp[0]);
}