UVa:571 Jugs

来源:互联网 发布:vmware mac镜像下载 编辑:程序博客网 时间:2024/05/16 09:28

题意:给你两个给定容积的桶,无限量的水,要求你输出倒出指定容积水的步骤。

思路:bfs+剪枝。一定要判重,否则会RE。递归打印步骤。

 

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;struct State{    int x[3],id;};struct Path{    int user,op,pre,id;};Path p[1000000];int X[3],N;bool vis[1005][1005],ok;void Fill(int &a,int &b,int A,int B){    if(a+b<=B)    {        b=a+b;        a=0;    }    else    {        a=a+b-B;        b=B;    }}void Judge(State ss){    if(ss.x[1]==N||ss.x[2]==N)        ok=true;}void Print_path(Path pth){    if(pth.op==1)    {        if(pth.user==1)puts("fill A");        else  puts("fill B");    }    else if(pth.op==2)    {        if(pth.user==1)puts("empty A");        else  puts("empty B");    }    else if(pth.op==3)    {        if(pth.user==1)puts("pour A B");        else  puts("pour B A");    }}void Out_put(Path pth){    if(pth.id==0) return;    Out_put(p[pth.pre]);    Print_path(pth);}int main(){    while(scanf("%d%d%d",&X[1],&X[2],&N)!=EOF)    {        State st;        memset(vis,0,sizeof(vis));        int _id=0;        st.x[1]=st.x[2]=st.id=0;        p[_id].pre=-1;        p[_id].id=_id++;        queue<State> q;        q.push(st);        ok=false;        while(!q.empty()&&!ok)        {            State tmp=q.front();            q.pop();            for(int i=1; i<=2&&!ok; ++i)            {                for(int j=1; j<=3&&!ok; ++j) //1 倒满 2 倒空 3 倒到另一个中                {                    State t=tmp;                    if(j==1)                    {                        if(tmp.x[i]==X[i]) continue;                        t.x[i]=X[i];                    }                    else                    {                        if(!tmp.x[i]==X[i]) continue;                        if(j==2)                            t.x[i]=0;                        else if(j==3)                        {                            if(i==1)                                Fill(t.x[1],t.x[2],X[1],X[2]);                            else                                Fill(t.x[2],t.x[1],X[2],X[1]);                        }                    }                    if(vis[t.x[1]][t.x[2]]) continue;                    else                    {                        vis[t.x[1]][t.x[2]]=true;                        t.id=_id;                        p[_id].pre=tmp.id;                        p[_id].user=i;                        p[_id].op=j;                        p[_id].id=_id;                        _id++;                        q.push(t);                    }                    Judge(t);                }            }        }        Out_put(p[_id-1]);        puts("success");    }    return 0;}


 

原创粉丝点击