POJ3414 BFS

思路简单,BFS,就是其中一些小技巧比较恶心。代码也写得恶心。

#include<iostream>

//#include<queue>
#include<string>
using namespace std;
const int N=105;
char str[7][10]={"","FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
int visit[N][N];
int A,B,C;
struct node
{
int a,b;
char* s;
node*pre;
}que[9999999];
bool isequal(node nod)
{
if(nod.a==C||nod.b==C)
return true;
return false;
}
node fill(node nod,int i)
{
if(i==1)
nod.a=A;
else if(i==2)
nod.b=B;
nod.s=str[i];
return nod;
}
node drop(node nod,int i)
{
if(i==1)
nod.a=0;
else if(i==2)
nod.b=0;
nod.s=str[i+2];
return nod;
}
node pour(node nod,int i)
{
if(i==1)
{
if(nod.a+nod.b>B)
{
nod.a-=B-nod.b;
nod.b=B;
}
else
{
nod.b+=nod.a;
nod.a=0;
}
}
else if(i==2)
{
if(nod.a+nod.b>A)
nod.b-=A-nod.a,nod.a=A;
else
nod.a+=nod.b,nod.b=0;
}
nod.s=str[4+i];
return nod;
}
void print(node * nod)
{
if(nod->pre==NULL)
return;
else
{
print(nod->pre);
printf("%s\n",nod->s);
}
}
void bfs()
{

node now,next;
int head=1,tail=1;
now.a=0;
now.b=0;
now.s=NULL;
now.pre=NULL;
visit[0][0]=1;
que[tail++]=now;
while(tail>head)
{
now=que[head++];
if(isequal(now))
{
printf("%d\n",visit[now.a][now.b]-1);
print(&now);
return; 
}
next=fill(now,1),next.pre=&que[head-1];
if(!visit[next.a][next.b])
visit[next.a][next.b]=visit[now.a][now.b]+1,que[tail++]=next;
next=fill(now,2),next.pre=&que[head-1];
if(!visit[next.a][next.b])
visit[next.a][next.b]=visit[now.a][now.b]+1,que[tail++]=next;
next=drop(now,1),next.pre=&que[head-1];
if(!visit[next.a][next.b])
visit[next.a][next.b]=visit[now.a][now.b]+1,que[tail++]=next;
next=drop(now,2),next.pre=&que[head-1];
if(!visit[next.a][next.b])
visit[next.a][next.b]=visit[now.a][now.b]+1,que[tail++]=next;
next=pour(now,1),next.pre=&que[head-1];
if(!visit[next.a][next.b])
visit[next.a][next.b]=visit[now.a][now.b]+1,que[tail++]=next;
next=pour(now,2),next.pre=&que[head-1];
if(!visit[next.a][next.b])
visit[next.a][next.b]=visit[now.a][now.b]+1,que[tail++]=next;
}
printf("impossible\n");
}
int main()
{
//freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
scanf("%d %d %d\n",&A,&B,&C);
bfs();
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值