题目链接:https://vjudge.net/problem/POJ-3414
题解:此题是判断几步之后最快能到达最终状态,典型的bfs。
需要注意:1.开始的杯子是空的
2.储存步骤的新方法:结构体定义string来储存步骤编号和序数,string数组来表达
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iomanip>
#include<string>
#define maxn 10100
using namespace std;
typedef pair<int,int> P;
string str[10]={"","FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};//空出第一个是为了区分
int a,b,k;
class C
{
public:
int bu;//步数
int fr,en;//第一个桶和第二个桶
string s;//存储步骤的个数和标志//s.length是步骤的个数,s[i]是步骤的长度
C(int f,int e,int b,string ss):fr(f),en(e),bu(b),s(ss){}
};
queue<C>que;
int v[110][110];
void bfs()
{
int xu=0;
int ff=0;
v[a][b]=1;
que.push(C(0,0,0,""));
while(!que.empty())
{
C c=que.front();
que.pop();
int va=c.fr;
int vb=c.en;
int step=c.bu;
if(va==k||vb==k)//循环终止的条件
{
ff=1;
cout<<c.bu<<endl;
for(int i=0;i<c.s.length();i++)
{
cout<<str[c.s[i]-'0']<<endl;
}
break;
}
if(va<a&&v[a][vb]==0)//装满a
{
v[a][vb]=1;//已经被用过
que.push(C(a,vb,step+1,c.s+"1"));
}
if(vb<b&&v[va][b]==0)//装满b
{
v[va][b]=1;
que.push(C(va,b,step+1,c.s+"2"));
}
if(va!=0&&v[0][vb]==0)//拿出a
{
v[0][vb]=1;
que.push(C(0,vb,step+1,c.s+"3"));
}
if(vb!=0&&v[va][0]==0)//拿出b
{
v[va][0]=1;
que.push(C(va,0,step+1,c.s+"4"));
}
if(vb!=b)//a放进b
{
if(va+vb<=b&&v[0][va+vb]==0)//装不满
{
v[0][va+vb]=1;
que.push(C(0,va+vb,step+1,c.s+"5"));
}
if(va+vb>b&&v[va-(b-vb)][b]==0)
{
v[va-(b-vb)][b]=1;
que.push(C(va+vb-b,b,step+1,c.s+"5"));
}
}
if(va!=a)//b放进a
{
if(va+vb<=a&&v[va+vb][0]==0)//装不满
{
v[va+vb][0]=1;
que.push(C(va+vb,0,step+1,c.s+"6"));
}
if(va+vb>a&&v[a][vb+va-a]==0)
{
v[a][vb+va-a]=1;
que.push(C(a,vb+va-a,step+1,c.s+"6"));
}
}
}
if(!ff)
cout<<"impossible"<<endl;
}
int main()
{
while(!que.empty())
que.pop();
memset(v,0,sizeof(v));
cin>>a>>b>>k;
bfs();
return 0;
}