• Pots POJ 3414


    http://poj.org/problem?id=3414

    题意: 现给出两个容量分别为 A ,B 的两个杯子, 让你兑出容量为 C 的水。

    分析:  现只可能有六种操作, 然后需要一个一个判断,最后递归输出路径

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    #define maxn 110
    
    char op[6][20] = {"FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)"};
    
    int a, b, c;
    
    /*
      需开出两个结构体,一个开成一维表示两个杯子中的水各是多少,另一个开成二维来存储走过的路径和步数和。
    */
    struct node
    {
        int x, y, step, k;
    } v[maxn][maxn];
    
    struct point
    {
      int x, y;
    };
    
    void DFS(int p, int q)
    {
        if(p == 0 && q == 0)
            return ;
    
        DFS(v[p][q].x, v[p][q].y);
    
        printf("%s
    ", op[v[p][q].k]);
    }
    
    void BFS()
    {
        point begins, now, next;
        begins.x=begins.y=0;
    
        queue<point>Q;
        Q.push(begins);
        v[0][0].step = 0;
    
        while(Q.size())
        {
            now = Q.front();
            Q.pop();
    
            if(now.x == c || now.y == c)
            {
                printf("%d
    ", v[now.x][now.y].step);
    
                DFS(now.x, now.y);
                return ;
            }
    
            for(int i=0; i<6; i++)
            {
                if(i == 0)
                    next.x = a, next.y=now.y;
                else if(i == 1)
                    next.y = b, next.x=now.x;
                else if(i == 2)
                    next.x = 0, next.y=now.y;
                else if(i == 3)
                    next.y = 0, next.x=now.x;
                else if(i == 4)
                {
                     if(now.x+now.y<=b)
                        next.x = 0, next.y=now.x+now.y;
                    else
                        next.x = now.x+now.y-b, next.y = b;
                }
                else
                {
                     if(now.x+now.y<=a)
                        next.x = now.x+now.y, next.y=0;
                    else
                        next.x = a, next.y = now.x+now.y-a;
                }
                if(v[next.x][next.y].step == 0)
                {
                    v[next.x][next.y].k = i;
                     v[next.x][next.y].step = v[now.x][now.y].step + 1;
                    v[next.x][next.y].x = now.x;
                    v[next.x][next.y].y = now.y;
                    Q.push(next);
                }
    
            }
        }
        printf("impossible
    ");
    }
    
    int main()
    {
        memset(v, 0, sizeof(v));
        scanf("%d %d %d", &a, &b, &c);
    
        BFS();
    
        return 0;
    }
    View Code

     

  • 相关阅读:
    GTD180007:【运维】LINUX学习
    GTD180006:【运维】安装调试GDB
    {done}GTD180005:【翻译】LISP prehistory
    ComPiler180001:【学习】编译器学习链接
    AIIE180002:AIIE2015大会主题
    AIIE180001:AIIE2016大会主题
    GTD180004:【开发】python_med
    GTD180003:【开发】python_oeis
    欧亚大帝国及一战、二战
    大洲分界线
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5694090.html
Copyright © 2020-2023  润新知