您的位置:首页 > 其它

POJ 3414 BFS 模拟求最快方式

2016-03-02 20:38 225 查看
点击打开链接

题意:给出两个容积分别为 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: