计蒜客——无脑博士的试管们

传送门: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]);
}

发布了7 篇原创文章 · 获赞 1 · 访问量 1422

猜你喜欢

转载自blog.csdn.net/qq_16722653/article/details/86602429