感想:这是我的第一道oj题,思路我想了很久,感觉建模能力还是不够强啊,理清楚了就好,把各个操作看成一条路,BFS就好
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1005
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<deque>
using namespace std;
string s[7]={"fill A","fill B","empty A","empty B","pour A B","pour B A","success"};
vector<string> t;
struct jugs {
int AT;
int BT;
};
deque<jugs> de;
int A,B,N;
int main(){
while(scanf("%d %d %d",&A,&B,&N)!=EOF){
int *isread=new int[(A+2)*(B+2)];
int *a=new int[(A+2)*(B+2)];
int *c=new int[(A+2)*(B+2)];
jugs em,temp1,temp2;
em.AT=0;
em.BT=0;
isread[0*B+0]=1;
de.clear();
de.push_back(em);
while(!de.empty()){
temp1=de.front();
de.pop_front();
if(isread[A*(B+1)+temp1.BT]==0){
temp2=temp1;
temp2.AT=A;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=0;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(isread[temp1.AT*(B+1)+B]==0){
temp2=temp1;
temp2.BT=B;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=1;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(isread[temp1.AT+temp1.BT]==0&&temp1.AT+temp1.BT<=B){
temp2.AT=0;
temp2.BT=temp1.AT+temp1.BT;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=4;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(temp1.AT+temp1.BT>B&&isread[(temp1.AT-B+temp1.BT)*(B+1)+B]==0){
temp2.AT=temp1.AT-B+temp1.BT;
temp2.BT=B;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=4;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(temp1.AT+temp1.BT>A&&isread[A*(B+1)+(temp1.BT-A+temp1.AT)]==0){
temp2.AT=A;
temp2.BT=temp1.BT-A+temp1.AT;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=5;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(isread[(temp1.AT+temp1.BT)*(B+1)]==0&&temp1.AT+temp1.BT<=A){
temp2.BT=0;
temp2.AT=temp1.AT+temp1.BT;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=5;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(isread[temp1.BT]==0){
temp2.AT=0;
temp2.BT=temp1.BT;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=2;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
if(isread[temp1.AT*(B+1)]==0){
temp2.BT=0;
temp2.AT=temp1.AT;
a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT;
c[temp2.AT*(B+1)+temp2.BT]=3;
if(temp2.BT==N)
break;
de.push_back(temp2);
isread[temp2.AT*(B+1)+temp2.BT]=1;
}
}
int tt=temp2.AT*(B+1)+temp2.BT;
t.clear();
while(tt!=0){
t.push_back(s[c[tt]]);
tt=a[tt];
}
for(int i=t.size()-1;i>=0;i--){
cout<<t[i]<<endl;
}
cout<<"success"<<endl;
}
}