题目链接:http://poj.org/problem?id=3414
题意: 给你两个空的瓶子,容量为输入的A,B,问经过几步操作任意一个瓶子能够得到C的水量;
6个操作:用水装满A瓶FILL(1),用水装满B瓶FILL(2),将A内水倒出DROP(1),将B内水倒出DROP(2),
将A内的水倒入B内POUR(1,2),将B内的水倒入A内POUR(2,1).注意倒后剩余的水保留在原水瓶中.
解题方法: 直接暴力搜索每一种状态,就可以了...
这是我做的第一道需要输出过程的BFS()具有保留意义..哈哈
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
struct node
{
int a,b;
int pos;
int step;
string out;
}ic,tmp;
int a,b,c;
bool vis[105][105];
map<string,bool>m;
void init()
{
memset(vis,0,sizeof(vis));
m.clear();
}
void bfs()
{
node queue[1000];
int head=0;
int tail=0;
queue[tail].a=queue[tail].b=queue[tail++].step=0;
vis[0][0]=1;
while(head<tail)
{
ic=queue[head];
if(ic.a==c||ic.b==c)
{
cout<<ic.step<<endl;
int x=ic.step;
string s[1000];
for(int i=0;i<x;++i)
{
s[i]=ic.out;
ic=queue[ic.pos];
}
for(int i=x-1;i>=0;--i)
cout<<s[i]<<endl;
return ;
}
//<1>..........................
tmp=queue[head];
tmp.a=a;
if(!vis[tmp.a][tmp.b])
{
tmp.step++;
tmp.pos=head;
tmp.out="FILL(1)";
queue[tail++]=tmp;
vis[tmp.a][tmp.b]=1;
}
//<2>..........................
tmp=queue[head];
tmp.b=b;
if(!vis[tmp.a][tmp.b])
{
tmp.step++;
tmp.pos=head;
tmp.out="FILL(2)";
queue[tail++]=tmp;
vis[tmp.a][tmp.b]=1;
}
//<3>...........................
tmp=queue[head];
tmp.a=0;
if(!vis[tmp.a][tmp.b])
{
tmp.step++;
tmp.pos=head;
tmp.out="DROP(1)";
queue[tail++]=tmp;
vis[tmp.a][tmp.b]=1;
}
//<4>..............................
tmp=queue[head];
tmp.b=0;
if(!vis[tmp.a][tmp.b])
{
tmp.step++;
tmp.pos=head;
tmp.out="DROP(2)";
queue[tail++]=tmp;
vis[tmp.a][tmp.b]=1;
}
//<5>...............................
tmp=queue[head];
int x=min(tmp.a,b-tmp.b);
tmp.a-=x;
tmp.b+=x;
if(!vis[tmp.a][tmp.b])
{
tmp.step++;
tmp.pos=head;
tmp.out="POUR(1,2)";
queue[tail++]=tmp;
vis[tmp.a][tmp.b]=1;
}
//<6>...............................
tmp=queue[head];
x=min(a-tmp.a,tmp.b);
tmp.a+=x;
tmp.b-=x;
if(!vis[tmp.a][tmp.b])
{
tmp.step++;
tmp.pos=head;
tmp.out="POUR(2,1)";
queue[tail++]=tmp;
vis[tmp.a][tmp.b]=1;
}
head++;
}
cout<<"impossible"<<endl;
}
int main()
{
while(cin>>a>>b>>c)
{
init();
bfs();
}
}