zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    Codeforces Round #733
    [ZJOI2007] 时态同步(树形dp)
    最大子树和(树形dp)
    P2015 二叉苹果树
    没有上司的舞会(经典树形dp)
    P3884 [JLOI2009]二叉树问题(LCA)
    Bin Packing Problem(线段树 + multiset)
    P4281 [AHOI2008]紧急集合 / 聚会(最近公共祖先)
    P3128 [USACO15DEC]Max Flow P(LCA 树上差分)
    java中Set接口用法
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5694090.html
Copyright © 2011-2022 走看看