• 计蒜客 无脑博士的试管们 【dfs】


    题目链接:https://nanti.jisuanke.com/t/31

    题目大意:

    无脑博士有三个容量分别是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>
    using namespace std;
    
    int f[21][21][21];
    int A, B, C;
    
    void dfs(int x, int y, int z)
    {
        if (x + z > A)     //C向A倒
        {
            if (f[A][y][x + z - A] == 0)
            {
                f[A][y][x + z - A] = 1;
                dfs(A, y, x + z - A);
            }
        }
        else
        {
            if (f[x + z][y][0] == 0)
            {
                f[x + z][y][0] = 1;
                dfs(x + z, y, 0);
            }
        }
        if (y + z>B)   //C向B倒
        {
            if (f[x][B][y + z - B] == 0)
            {
                f[x][B][y + z - B] = 1;
                dfs(x, B, y + z - B);
            }
        }
        else
        {
            if (f[x][y + z][0] == 0)
            {
                f[x][y + z][0] = 1;
                dfs(x, y + z, 0);
            }
        }
        if (x + y >B)   //A向B倒
        {
            if (f[x + y - B][B][z] == 0)
            {
                f[x + y - B][B][z] = 1;
                dfs(x + y - B, B, z);
            }
        }
        else
        {
            if (f[0][x + y][z] == 0)
            {
                f[0][x + y][z] = 1;
                dfs(0, x + y, z);
            }
        }
        if (x + z > C)  //A向C倒
        {
            if (f[x + z - C][y][C] == 0)
            {
                f[x + z - C][y][C] = 1;
                dfs(x + z - C, y, C);
            }
        }
        else
        {
            if (f[0][y][x + z] == 0)
            {
                f[0][y][x + z] = 1;
                dfs(0, y, x + z);
            }
        }
        if (x + y > A)  //B向A倒
        {
            if (f[A][x + y - A][z] == 0)
            {
                f[A][x + y - A][z] = 1;
                dfs(A, x + y - A, z);
            }
        }
        else
        {
            if (f[x + y][0][z] == 0)
            {
                f[x + y][0][z] = 1;
                dfs(x + y, 0, z);
            }
        }
        if (y + z > C)   //B向C倒
        {
            if (f[x][y + z - C][C] == 0)
            {
                f[x][y + z - C][C] = 1;
                dfs(x, y + z - C, C);
            }
        }
        else
        {
            if (f[x][0][y + z] == 0)
            {
                f[x][0][y + z] = 1;
                dfs(x, 0, y + z);
            }
        }
    
    }
    
    int main()
    {
        int i, j, k;
        void dfs(int x, int y, int z);
        cin >> A >> B >> C;
        for (i = 0; i < A + 1; i++)
            for (j = 0; j < B + 1; j++)
                for (k = 0; k < C + 1; k++)
                    f[i][j][k] = 0;
        f[0][0][C] = 1;
        dfs(0, 0, C);
        for (k = 0; k < C + 1; k++)
            for (j = 0; j < B + 1; j++)
                if (f[0][j][k] > 0)
                {
                    cout << k;
                    if (k != C) cout << ' ';
                }
        return 0;
    }


    2018-05-14
  • 相关阅读:
    [转]Kqueue与epoll机制
    [转]Docker中的镜像
    [转]linux awk命令详解
    [转]Linux Shell 1>/dev/null 2>&1 含义
    file_get_contents(): SSL operation failed with code 1...解决办法和stream_context_create作用
    PHP abstract与interface之间的区别
    PHP基于Redis的全局订单号id
    Eclipse for php+Xdebug,搭建php单步调试环境
    Eclipse launch configuration----Eclipse运行外部工具
    MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转
  • 原文地址:https://www.cnblogs.com/00isok/p/9035589.html
Copyright © 2020-2023  润新知