POJ 3414 BFS 模拟求最快方式

点击打开链接

题意:给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。


      1.FILL(i):将ipot倒满水。

      2.DROP(i):将ipot倒空水。

      3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。

      bfs求最短路径

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define PI acos(-1)
#define eps 0.00000001
#define LL long long
using namespace std;
struct node
{
    int next;
    int a,b,num,op;
}p[1000010];
int a,b,c,top;
int acc[1000010];
int vis[1000][1000],j;
int BFS()
{
    queue<node>Q;
    node to;
    int top=0;
    p[top].a=0;   ///记录第一个pot 存放的值
    p[top].b=0;    ///记录第一个pot 存放的值
    p[top].next=-1;    ///记录上一次pot 的下标
    p[top].num=0;    /// ///记录当前pot 的下标
    p[top].op=-1;      /// ///记录当前pot 是啥操作之后的结果
    Q.push(p[top]);
    top++;
    memset(vis,0,sizeof(vis));
    while(!Q.empty())
    {
        node t=Q.front();
        Q.pop();
        if(vis[t.a][t.b])
            continue;
        if(t.a==c||t.b==c)
        {   j=0;
            int k=t.next;
            acc[j++]=t.op;
            while(p[k].next!=-1)
            {
                acc[j++]=p[k].op;
                k=p[k].next;
            }
            return 1;
        }
        vis[t.a][t.b]=1;
        for(int i=1;i<=6;i++)
        {
            if(i==1)
            {
                p[top].a=a;
                p[top].b=t.b;
            }
            if(i==2)
            {
                p[top].a=t.a;
                p[top].b=b;
            }
            if(i==3)
            {
                p[top].a=0;
                p[top].b=t.b;
            }
            if(i==4)
            {
                p[top].a=t.a;
                p[top].b=0;
            }
            if(i==5)
            {
                p[top].a=(t.a+t.b-b<0?0:(t.a-b+t.b));
                p[top].b=(t.a+t.b-b<0?(t.a+t.b):b);
            }
            if(i==6)
            {
                p[top].a=(t.a+t.b-a<0?(t.a+t.b):a);
                p[top].b=(t.a+t.b-a<0?0:(t.a-a+t.b));
            }
                p[top].next=t.num;
                p[top].op=i;
                p[top].num=top;
                Q.push(p[top++]);
        }
    }
    return 0;
}
int main()
{
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        top=0;
        int flag=BFS();
        if(!flag)
        {
          printf("impossible\n");
          continue;
        }
        printf("%d\n",j);
        for(int i=j-1;i>=0;i--)
        {
            if(acc[i]==1)
                printf("FILL(1)\n");
            if(acc[i]==2)
                printf("FILL(2)\n");
            if(acc[i]==3)
                printf("DROP(1)\n");
            if(acc[i]==4)
                printf("DROP(2)\n");
            if(acc[i]==5)
                printf("POUR(1,2)\n");
            if(acc[i]==6)
                 printf("POUR(2,1)\n");
        }
    }
    return 0;
}



你可能感兴趣的:(POJ 3414 BFS 模拟求最快方式)