poj 3414 pots (bfs 倒水问题)

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std;

int vis[120][120];

int vl,vr;

int ok;

int key;

struct node

{

    int l,r;

    int fa;

    int op;

};

node str[100000];

int ans[100000];

void bfs()

{

    int l=0,r=1;

    node next;

    str[0].l=0;

    str[0].r=0;

    str[0].fa=0;

    while(l<r)

    {

        //printf("%d %d...\n",str[l].l,str[l].r);

        vis[str[l].l][str[l].r]=1;

        if(str[l].l==key||str[l].r==key)

        {

            ok=1;

            int len=0;

            while(str[l].fa!=0)

            {

                ans[len++]=str[l].op;

                l=str[l].fa;

            }

            ans[len]=str[l].op;

            printf("%d\n",len+1);

            for(int i=len;i>=0;i--)

            {

                if(ans[i]==1) printf("FILL(1)\n");

                else if(ans[i]==2)  printf("FILL(2)\n");

                    else if(ans[i]==3) printf("DROP(1)\n");

                    else if(ans[i]==4) printf("DROP(2)\n");

                    else if(ans[i]==5) printf("POUR(1,2)\n");

                    else if(ans[i]==6) printf("POUR(2,1)\n");

            }

            return ;

        }

        if(str[l].l<vl)

        {

            next.l=vl;

            next.r=str[l].r;

            next.fa=l;

            next.op=1;

            if(vis[next.l][next.r]==0)

            str[r++]=next;



            if(str[l].r>0)

            {

               next.l=str[l].l+str[l].r;

               if(next.l>vl)

               {

                   next.r=next.l-vl;

                   next.l=vl;

               }

               else next.r=0;

               next.fa=l;

               next.op=6;

              if(vis[next.l][next.r]==0)

               str[r++]=next;

            }



        }

        if(str[l].r<vr)

        {

            next.l=str[l].l;

            next.r=vr;

            next.fa=l;

            next.op=2;

            if(vis[next.l][next.r]==0)

            str[r++]=next;



            if(str[l].l>0)

            {

               next.r=str[l].l+str[l].r;

               if(next.r>vr)

               {

                   next.l=next.r-vr;

                   next.r=vr;

               }

               else next.l=0;

               next.fa=l;

               next.op=5;

              if(vis[next.l][next.r]==0)

               str[r++]=next;

            }

        }

        if(str[l].l>0)

        {

            next.l=0;

            next.r=str[l].r;

            next.fa=l;

            next.op=3;

            if(vis[next.l][next.r]==0)

            str[r++]=next;

        }

        if(str[l].r>0)

        {

            next.l=str[l].l;

            next.r=0;

            next.fa=l;

            next.op=4;

            if(vis[next.l][next.r]==0)

            str[r++]=next;

        }

        l++;

    }

}

int main()

{

    while(scanf("%d%d%d",&vl,&vr,&key)!=EOF)

    {

        memset(vis,0,sizeof(vis));

        ok=0;

        bfs();

        if(ok==0)

            printf("impossible\n");

    }

    return 0;

}

  

你可能感兴趣的:(poj)