zoukankan      html  css  js  c++  java
  • Pots POJ

    Pots
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 22688   Accepted: 9626   Special Judge

    Description

    You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:

    1. FILL(i)        fill the pot i (1 ≤ ≤ 2) from the tap;
    2. DROP(i)      empty the pot i to the drain;
    3. POUR(i,j)    pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j).

    Write a program to find the shortest possible sequence of these operations that will yield exactly C liters of water in one of the pots.

    Input

    On the first and only line are the numbers AB, and C. These are all integers in the range from 1 to 100 and C≤max(A,B).

    Output

    The first line of the output must contain the length of the sequence of operations K. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.

    Sample Input

    3 5 4

    Sample Output

    6
    FILL(2)
    POUR(2,1)
    DROP(1)
    POUR(2,1)
    FILL(2)
    POUR(2,1)

    Source

    Northeastern Europe 2002, Western Subregion

    题意:

    有二个水壶,对水壶有三种操作:

    1)FILL(i),将i水壶的水填满;

    2)DROP(i),将水壶i中的水全部倒掉;

    3)POUR(i,j)将水壶i中的水倒到水壶j中,若水壶 j 满了,则 i 剩下的就不倒了,问进行多少步操作,并且怎么操作,输出操作的步骤,两个水壶中的水可以达到C这个水量。如果不可能则输出impossible。初始时两个水壶是空的,没有水。

    思路:

    模拟一下,然后如果当前的状态已经出现过了就说明不可以这样子,必须要用其他操作,这个和poj3087的题目有点像,这里还需要储存一个路径,这个和poj3984有点像,poj3984之前的博客里面用了递归的方式输出路径,这一回用了栈,两种方法应该都可以做的,具体的看代码吧,注释已经很清楚了

     

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define eps 1e-10
    #define PI acos(-1.0)
    #define _e exp(1.0)
    #define ll long long
    const int maxn=110;
    struct cup
    {
        int x,y;            //a和b的当前水的状态
        int step;
        int flag;           //标记操作,是操作几
        cup *pre;           //记录路径的玩意儿
    };
    queue<cup>que;
    stack<int>R;
    int a,b,e;
    int vis[maxn][maxn]={0};     //记录当前的状态是否到达过
    int ans;
    
    void bfs(int x,int y)
    {
        cup c;
        cup t[317];           //目前瓶子里剩余的水量
        c.x=0;
        c.y=0;
        c.flag=0;
        c.pre=NULL;
        c.step=0;
        que.push(c);
        vis[x][y]=1;
        int count=-1;
        while(!que.empty())
        {
            count++;
            t[count]=que.front();
            que.pop();
            for(int i=1;i<=6;i++)
            {
                switch(i)
                {
                    case 1:             //fill a
                        c.x=a;
                        c.y=t[count].y;
                        c.flag=1;
                        break;
                    case 2:             //fill b
                        c.x=t[count].x;
                        c.y=b;
                        c.flag=2;
                        break;
                    case 3:             //drop a
                        c.x=0;
                        c.y=t[count].y;
                        c.flag=3;
                        break;
                    case 4:             //drop b
                        c.x=t[count].x;
                        c.y=0;
                        c.flag=4;
                        break;
                    case 5:             //pour a to b
                        if(t[count].x>b-t[count].y)     //a可以装满b
                        {
                            c.x=t[count].x-(b-t[count].y);
                            c.y=b;
                        }
                        else                            //a不能装满b
                        {
                            c.x=0;
                            c.y=t[count].y+t[count].x;
                        }
                        c.flag=5;
                        break;
                    case 6:           //pour b to a
                        if(t[count].y>a-t[count].x)     //b可以装满a
                        {
                            c.y=t[count].y-(a-t[count].x);
                            c.x=a;
                        }
                        else                            //b不可以装满a
                        {
                            c.x=t[count].x+t[count].y;
                            c.y=0;
                        }
                        c.flag=6;
                        break;
                }
                if(vis[c.x][c.y])
                    continue;
                vis[c.x][c.y]=1;
                c.step=t[count].step+1;
                c.pre=&t[count];
                if(c.x==e || c.y==e)
                {
                    ans=c.step;
                    while(c.pre)
                    {
                        R.push(c.flag);
                        c=*c.pre;
                    }
                    return;
                }
                que.push(c);
            }
        }
    }
    void print()
    {
        while(!R.empty())
        {
            int i=R.top();
            R.pop();
            switch(i)
            {
                case 1:cout<<"FILL(1)"<<endl;break;
                case 2:cout<<"FILL(2)"<<endl;break;
                case 3:cout<<"DROP(1)"<<endl;break;
                case 4:cout<<"DROP(2)"<<endl;break;
                case 5:cout<<"POUR(1,2)"<<endl;break;
                case 6:cout<<"POUR(2,1)"<<endl;break;
            }
        }
    }
    int main()
    {
        cin>>a>>b>>e;
        bfs(0,0);
        if(ans==0)
            cout<<"impossible"<<endl;
        else
        {
            cout<<ans<<endl;
            print();
        }
        return 0;
    }
  • 相关阅读:
    UVa 10810
    Android UI开发第三十四篇——SlidingPaneLayout
    eclipse安装插件checkstyle
    eas bos 编辑界面 editUIt 属性值为空
    [置顶] 使用U盘安装ubuntu系统
    Ajax核心——XMLHttpRequest基础
    转储指定的数据块并查看TRC信息
    android 获取当前版本号/修改自定义的应用程序的版本号
    poj3101
    [置顶] mysql中的set和enum类型的用法和区别
  • 原文地址:https://www.cnblogs.com/smallhester/p/9607966.html
Copyright © 2011-2022 走看看