题目链接:http://poj.org/problem?id=3414
思路:很简单,就是搜索即可,只是杯中的水进行状态转移时的代码有点不太好写。
代码:
#include<iostream>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<string>
#define LL __int64
#define INF 0xffffffff
using namespace std;
struct state{
int a[2];
string p,v;
};
int A[2],C,vis[110][110];
state change(state t,int i,int j,int &op){//进行状态转移,j对应操作的1,2,3;i为操作对象
if(j==3){
int amount=min(t.a[i],A[1-i]-t.a[1-i]);
t.a[i]-=amount;t.a[1-i]+=amount;
if(vis[t.a[0]][t.a[1]]) {op=0;return t;}
vis[t.a[0]][t.a[1]]=1;
t.p+='3';t.v+=i+'0';op=1;return t;
}
t.a[i]=(j==1? A[i]:0);
if(vis[t.a[0]][t.a[1]]) {op=0;return t;}
vis[t.a[0]][t.a[1]]=1;
t.p+='0'+j;t.v+='0'+i;
op=1;return t;
}
void bfs(){
memset(vis,0,sizeof(vis));
queue<state> Q;
Q.push((state){0,0,"",""});
vis[0][0]=1;
while(!Q.empty()){
state tp=Q.front();
if(tp.a[0]==C || tp.a[1]==C) {
cout<<(int)tp.p.size()<<endl;
for(int i=0;i<(int)tp.p.size();i++){
if(tp.p[i]=='1') printf("FILL(%c)",tp.v[i]+1);
else if(tp.p[i]=='2') printf("DROP(%c)",tp.v[i]+1);
else printf("POUR(%c,%c)",tp.v[i]+1,'2'-tp.v[i]+'0');
printf("\n");
}
return;
}
Q.pop();
for(int i=0;i<2;i++)
for(int j=1;j<=3;j++){
int op=0;
state tp2=change(tp,i,j,op);
if(op==0) continue;
Q.push(tp2);
}
}
cout<<"impossible\n";
}
int main(){
while(cin>>A[0]){
cin>>A[1]>>C;
bfs();
}
return 0;
}